我最终希望掌握动态编程的知识,但是在此之前,我很难理解它的流程。我了解递归,但无法理解流程:
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
吗?
我不确定我的理解哪里出了问题。
答案 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>