迭代是人,递归是神

怎么去正视迭代与递归呢?

正如数学之美所说,To iterate is human,to recurse divine.迭代是人,递归是神。


以斐波那契数列来作为表示
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2);


迭代,更加符合我们的思维方式,我们更加容易去写出来。就如上述的表示方法来说,大部分的人都可以简单的去理解它。那我们用代码表示的话就是下面简单的代码。便于人思考,理解,去写,去寻找错误。但是有一个问题,不断的调用这个函数的话带来大量不必要的开支,消耗大量的时间。具体解释见此

int fib(int n){  
     if(n>1) return fib(n-1) + fib(n-2);  
     else return n; // n = 0, 1时给出recursion终止条件  
}

递归,更加符合计算机计算的方式,有利于计算速度。不必不断的调用函数,以减少开支。代码如下:

int fib(int n){  
    int i, temp0, temp1, temp2;        
    if(n<=1) return n;  
    temp1 = 0;  
    temp2 = 1;  
    for(i = 2; i <= n; i++){  
        temp0 = temp1 + temp2;  
        temp1 = temp2;  
        temp2 = temp0;  
    }  
    return temp0;  
} 

你们可以将代码带入一个数字计算一下可以在45左右。对比可知。

爬楼梯

附上一道基础的爬楼梯的题目:

假设你正在爬楼梯。需要 n 步你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 步 + 1 步
  2. 2 步
示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 步 + 1 步 + 1 步
  2. 1 步 + 2 步
  3. 2 步 + 1 步

迭代:

int climbStairs(int n) {
        if(n <= 2)
            return n;
        if(n > 2)
            return climbStairs(n-1)+climbStairs(n-2);
    }

递归:

    int climbStairs(int n) {
    int i, temp0, temp1, temp2;        
    if(n<=2) return n;  
    temp1 = 1;  
    temp2 = 2;  
    for(i = 3; i <= n; i++){  
        temp0 = temp1 + temp2;  
        temp1 = temp2;  
        temp2 = temp0;  
    }  
    return temp0; 
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大奖:点击这里领取 在...
    HetfieldJoe阅读 5,759评论 0 14
  • 递归在解决某些问题的时候使得我们思考的方式得以简化,代码也更加精炼,容易阅读。那么既然递归有这么多的优点,我们是不...
    Clemente阅读 12,554评论 0 5
  • 第八章 递归(recursion) 8.1 导语 因为一些指导者倾向于先教递归作为第一个主要的控制结构,本章会以另...
    geoeee阅读 5,292评论 0 5
  • 1 概述 循环与递归是算法中最常见的控制过程的方法,循环自不必说,只要学过计算机语言,必然都会讲这种控制结构;而对...
    CodingTech阅读 5,505评论 6 6
  • 1 折纸让孩子学会思考,提高动手能力 手工折纸让小孩子在折纸的过程中学会思考,锻炼手的协调性,提高幼儿的动手操作能...
    素语飘香阅读 1,735评论 0 0