递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。
递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。
递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。
使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。迭代和递归过程都可以无限进行:如果循环条件测试永远不变成false,则迭代发生无限循环;如果递归永远无法回推到基本情况,则发生无穷递归。
递归函数是通过调用函数自身来完成任务,而且在每次调用自身时减少任务量。而迭代是循环的一种形式,这种循环不是由用户输入而控制,每次迭代步骤都必须将剩余的任务减少;也就是说,循环的每一步都必须执行一个有限的过程,并留下较少的步骤。
你的最后一句话是不是迭代是静态的,无法实现动态遍历加载?
@binger: 迭代和递归在表象上是一样的,本质的区别就是:
迭代是固化的公式,只有结束的条件,而递归是有独立思想意识的,内部运行会根据过程的不同而作不同的处理。
换句话说,迭代类似机械,而递归类似人工。
递归:就是在过程或函数里面调用自身
1 //用递归方法计算n的阶乘
2
3 long factorial(int n)
4
5 {
6
7 if(n<=0)
8
9 return 1;
10
11 else
12
13 return n*factorial(n-1);
14
15 }
迭代:利用变量的原值推算出变量的一个新值.用循环实现。
1 //用迭代的方法计算n的阶乘
2
3 long factorial(int n)
4
5 {
6
7 int result=1;
8
9 while(n>1)
10
11 {
12
13 result*=n;
14
15 n-=1;
16
17 }
18
19 return result;
20
21 }
递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。
往往有这样的观点:能不用递归就不用递归。
能举个用迭代方法实现动态加载二叉树结构的例子吗?比如绑定Treeview?
在一定情况下, 用循环实现的操作,用递归也可以实现的。
不一定吧,如果这样,递归早就被淘汰了
@binger:
下面是用递归和循环的方式解决n的阶乘问题。其中递归算法用了两种方式:
package com.fjn.other.for_digui; import org.junit.Test; public class Digui { @Test public void t1() { long a=1; // 用循环来计算n的阶乘 for(int i=1; i<=10; i++){ a*=i; } System.out.println(a); } // 递归解决n的阶乘 public long digui(int n, long a){ if(n<1) return a; return digui(n-1, a*n); } // 第二种递归方式解决N的阶乘 public long digui2(int n){ if(n>1) return digui2(n-1)*n; else{ return 1; } } @Test public void t2(){ int n=10; long a=digui(n,1); System.out.println(a); int m=10; long b=digui2(m); System.out.println(b); } }
你看看,这样的是否满足我上面说的。
@螺 丝 钉:
至于动态加载二叉树,也是可以有这两种方式的,也就是说既可以用循环实现,也可以用递归实现。
不过用循环实现比较麻烦
@螺 丝 钉:
另外,递归作为一种经典的算法,被取代是不可能的 ,有很多情况,用递归比较循环好用的多。也有很多功能确实只有循环才可以做到的。