javascript:了解斐波那契递归语句的流程

时间:2018-08-21 02:10:42

标签: javascript recursion

我最终希望掌握动态编程的知识,但是在此之前,我很难理解它的流程。我了解递归,但无法理解流程:

function fib(n) {
  if (n == 0) return 0;
  if (n == 1) return 1;
  return fib(n - 1) + fib(n - 2);
}
console.log(fib(3));

如果我有一个小的整数3,则它不会通过那两个条件,因此会命中return fib(n-1)+fib(n-2);。因此,据我所知,它将遍历该第一部分的第一部分:{{1 }}(3-1 = 2)... fib(n-1)不满足这些条件之一,因此它运行2(2-1 = 1)。 fib(n-1)确实满足其中一个条件,所以1并破坏了其中一部分。

现在转到下一部分:returns 1。 (3-2 = 1)。 fib(n-2)确实满足条件之一,所以1。 所以最后,不是返回returns 1吗?

我不确定我的理解哪里出了问题。

2 个答案:

答案 0 :(得分:1)

您是正确的,fib(3)应该返回2,因为2是斐波纳契数列中的第三个数字(从0开始)

将其写出为树有帮助:

       fib(3)
      /     \
    fib(2)   fib(1)
   /     \     \
 fib(1) fib(0)  1
 /        \  
1          0

在上方,您可以看到每个递归调用如何一直返回到0或1,然后将结果返回到上一层。

答案 1 :(得分:1)

我最喜欢的方法之一是从基本案例开始,然后倒退:

fib(0); // => 0
fib(1); // => 1

然后我们进入默认情况:

fib(2); // == fib(1) + fib(0) == 1 + 0 ==> 1
fib(3); // == fib(2) + fib(1) == 1 + 1 ==> 2
fib(4); // == fib(3) + fib(2) == 2 + 1 ==> 3

这比尝试首先弄清fib(4)容易得多,因为您需要嵌套。查看该功能很容易看到要尝试的方法。

也知道对同一函数的调用不会得到任何特殊待遇。它一直运行直到返回一个值,并且参数和局部变量在调用中是本地的,因此每个fib调用都有自己的n,并等待两次调用返回结果总和。 / p>