首页 新闻 赞助 找找看

迭代和递归区别

0
悬赏园豆:40 [已解决问题] 解决于 2014-08-08 21:51

请问迭代和递归的最大区别是不是静态和动态的区别?举个例子,动态加载二叉树结构只能由递归完成?

binger的主页 binger | 初学一级 | 园豆:123
提问于:2014-08-07 17:57
< >
分享
最佳答案
0

递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。
递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。
递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。
使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。迭代和递归过程都可以无限进行:如果循环条件测试永远不变成false,则迭代发生无限循环;如果递归永远无法回推到基本情况,则发生无穷递归。
递归函数是通过调用函数自身来完成任务,而且在每次调用自身时减少任务量。而迭代是循环的一种形式,这种循环不是由用户输入而控制,每次迭代步骤都必须将剩余的任务减少;也就是说,循环的每一步都必须执行一个有限的过程,并留下较少的步骤。

收获园豆:20
519740105 | 大侠五级 |园豆:5810 | 2014-08-07 17:58

你的最后一句话是不是迭代是静态的,无法实现动态遍历加载?

binger | 园豆:123 (初学一级) | 2014-08-07 22:20

@binger: 迭代和递归在表象上是一样的,本质的区别就是:

迭代是固化的公式,只有结束的条件,而递归是有独立思想意识的,内部运行会根据过程的不同而作不同的处理。

换句话说,迭代类似机械,而递归类似人工。

519740105 | 园豆:5810 (大侠五级) | 2014-08-08 08:30
其他回答(2)
0

递归:就是在过程或函数里面调用自身

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 }

 

递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。     

往往有这样的观点:能不用递归就不用递归。

 

收获园豆:5
LiuKaiFa | 园豆:1491 (小虾三级) | 2014-08-07 20:23

能举个用迭代方法实现动态加载二叉树结构的例子吗?比如绑定Treeview?

支持(0) 反对(0) binger | 园豆:123 (初学一级) | 2014-08-07 22:19
0

在一定情况下, 用循环实现的操作,用递归也可以实现的。

收获园豆:15
乐享程序员 | 园豆:930 (小虾三级) | 2014-08-07 21:28

不一定吧,如果这样,递归早就被淘汰了

支持(0) 反对(0) binger | 园豆:123 (初学一级) | 2014-08-07 22:21

@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);
    }
}

你看看,这样的是否满足我上面说的。

 

支持(0) 反对(0) 乐享程序员 | 园豆:930 (小虾三级) | 2014-08-07 22:44

@螺 丝 钉: 

至于动态加载二叉树,也是可以有这两种方式的,也就是说既可以用循环实现,也可以用递归实现。

不过用循环实现比较麻烦

支持(0) 反对(0) 乐享程序员 | 园豆:930 (小虾三级) | 2014-08-07 22:48

@螺 丝 钉:

另外,递归作为一种经典的算法,被取代是不可能的 ,有很多情况,用递归比较循环好用的多。也有很多功能确实只有循环才可以做到的。

支持(0) 反对(0) 乐享程序员 | 园豆:930 (小虾三级) | 2014-08-07 22:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册