一、递归

   程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

   递归的三个条件:
   边界条件
   递归前进段
   递归返回段
   当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
二、迭代
   利用变量的原值推算出变量的一个新值.
三、递归、迭代解决相同问题举例:

1、递归实现

/**求一个数的阶乘*/                               
int f(int num){                                         
  if(num==1||num==0){          
    return 1;                                          
  }else{                     
    return num*f(num-1);         
  }                    
}

/**累加求和*/              
int f(int num){                                       
  if(num==1){                
    return 1;               
  }else{                    
    return num+f(num-1);        
  }                    
}

/**斐波那契数列*/
int f(int num){                                         
  if(num==1||num==2){          
    return 1;                 
  }else{                   
    return f(num-1)+f(num-2);       
  }                       
}                        

/*把一个十进制数转换为二进制*/
static void f1(int num){                            
  if(num==0){                
    return;                 
  }else{                 
    f1(num/2);                
  }                      
  System.out.print(num%2);        
}                        

2、迭代实现

累加、累乘略

/*斐波那契数列*/
int f2(int num){
  if(num==1||num==2){
    return 1;
  }
  int n1=1,n2=1;
  int target=0;
  for(int i=0;i<num-2;i++){
    target=n1+n2;
    n1=n2;
    n2=target;
  }
  return target;
}

/**一个十进制数转换为二进制*/
void f(int num){
  ArrayList a=new ArrayList();
  int n=0;
  while(num!=0){
    n=num%2;
    a.add(n);
    num=num/2;
  }
  for(int i=a.size()-1;i>=0;i--){
    System.out.print(a.get(i));
  }
}

四、递归和迭代比较

递归其实是方便了程序员难为了机器,递归的优点是可以使代码更简洁清晰,可读性好,且可以解决少数迭代解决不了的困难问题;缺点是递归有大量函数调用(产生额外时间开销)和栈内存的开辟(占用大量栈内存),对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终.

迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。所以所有的迭代可以转换为递归,但递归不一定可以转换为迭代.

非递归函数虽然效率高,但却比较难编程,而且相对来说可读性差。   
现代程序设计的目标主要是可读性好。随着计算机硬件性能的不断提高,程序在更多的场合优先考虑可读而不是高效,所以,鼓励用递归函数实现程序思想。

javase(2)_递归&迭代的更多相关文章

  1. 算法基础_递归_求杨辉三角第m行第n个数字

    问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...

  2. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. SICP 关于递归迭代的重新理解以及尾递归的引入...

    看了线性的递归和迭代以及树形递归迭代这部分的内容,感觉对递归和迭代又有了新的理解...所以记录一下,也算对这部分内容的总结吧. 首先书中提到的递归与迭代和我以前想的有点不一样,我感觉书中提到的递归和迭 ...

  4. 020--python函数基础知识考试(包括:函数_递归等知识)

    1.列举布尔值为 False 的值 空,None,0, False, '', [], {}, () 2.写函数: 根据范围获取其中 3 和 7 整除的所有数的和,并返回调用者:符合条件的数字个数以及符 ...

  5. python基础-基础知识考试_day5 (包括:函数_递归等知识)

    老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, '', [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有数的和, ...

  6. DNS 递归/迭代 原理

    递归查询 递归:客户端只发一次请求,要求对方给出最终结果.一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结 ...

  7. LeetCode145 Binary Tree Postorder Traversal Java题解(递归 迭代)

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...

  8. [LeetCode题解]83. 删除排序链表中的重复元素 | 递归 + 迭代

    方法一:递归 解题思路 通过递归法,每次判断目前头节点与给定的节点是否相等.如是,继续判断下一个节点,否则保存当前头节点,设置 next 指向下次递归得到的节点,然后返回当前节点. 代码 /** * ...

  9. 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈

    题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...

随机推荐

  1. 51nod1414【思维】

    思路: 直接可以枚举1-n,如果枚举到是n的约数i,那么暴力枚举起点,其余点用i累加就一定是正多边形.复杂度是(n*n的公约数个数(最多80)): const int N=2e4+10; int a[ ...

  2. laravel 路由设置

    目录  routes\web.php 初始路由,直接渲染视图welcome,即V层   '/'为路径:www.xxx.com/ Route::get('/', function () { return ...

  3. 3DMAX 6 游戏特效制作

    3d主要是粒子系统为主,一个特效可能包含多个粒子系统,需要注意粒子系统尽量减少多余参数,材质shader在手机上要经过优化 另外可以使用面片加脚本实现滚动效果,比如瀑布等等 具体方法以后补充,占位

  4. CTP Release() 的注意问题

    测试时发现CThostFtdcMdSpi有个比较严重的问题,就是使用Release()退出清理对象时 会出现死机,并且频率很高,怎样解决? 答:请参考以下代码的释放顺序. template <c ...

  5. Html5shiv ---- 让IE低版本浏览器识别并支持HTML5标签

    Html5shiv.js是针对IE浏览器的 javaScript 补丁,作用如题 该脚本的下载链接 使用使在head标签中使用script标签引用即可

  6. 编译keepalived 方法

    作者的环境: redhat 6.5 64 位版 在编译keepalived 前,需要提前给环境安装两个依赖包--zlib和openssl 编译 zlib 库 参考作者之前的博客 http://www. ...

  7. stringstream转换

    在这之前,在杭电刷题的时候,并没有注意到这个好东西. 使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高 ...

  8. 解读ping -n 4 127.1 >nul 2>nul

    命令解读 ping是Windows.Unix和Linux系统下的一个命令.ping也属于一个通信协议,是TCP/IP协议的一部分.利用"ping"命令可以检查网络是否连通,可以很好 ...

  9. django 之 rest framework

    一 二 三 四 五 六 七 八

  10. Promise.then(a, b)与Promise.then(a).catch(b)问题详解

    原文: When is .then(success, fail) considered an antipattern for promises? 问题 我在bluebrid promise FAQ上面 ...