递归、迭代、动态规划的区别(通俗易懂版)以斐波那契数列为例

先介绍一下斐波那契这个经典算法题吧:

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

1. 递归

递归就是自己调用自己,时间和空间都耗用较多,大部分的刷题网站在斐波那契这个题目时都不支持用递归

var fib = function(n) {
    if(n<2) return n
    return fib(n-1)+fib(n-2)
};

2. 动态规划

动态规划可以理解成青蛙跳台阶,不管每一步跳多少个,最终的目的地台阶是一样的,只不过过程可能有多种,本质就是空间换时间 可以看到下面的方法是耗用了长度为n+1的数组的空间

function fib(n){
    
    var arr=[0,1]
    for(let i=2;i<=n;i++){
        arr[i]=arr[i-1]+arr[i-2]
    }
    return arr[n]

}

3. 迭代 

迭代就是不断用变量的旧值递推出新值的过程,简单来说变量还是那个变量,就是值在不断的变化,理解平时项目中的迭代,还是那个项目,功能却在不断的改变和完善,越来越接近最终的要求。可以看到下面的方法就是通过不断的改变 first、second和sum的值。

var fib = function(n) {
   if(n<=1) return n;
    var first=0,second=1;
    for(var i=2;i<=n;i++){
        var sum = first+second
        first=second;
        second=sum;
    }
    return sum;
};

猜你喜欢

转载自blog.csdn.net/a1059526327/article/details/107861002