当我读到描述函数递归的一章时,我是 Javascript 的新手,正在阅读它。它使用示例函数来查找斐波那契数列的第 n 个数字。代码如下:
function fibonacci(n) {
if (n < 2){
return 1;
} else {
return fibonacci(n-2) + fibonacci(n-1);
}
}
console.log(fibonacci(7)); //Returns 21
我无法准确理解这个函数正在做什么。有人能解释一下这是怎么回事吗?我被困在第五行,函数调用自身。这里发生了什么事?
您正在根据自身定义一个函数。一般来说,fibonnaci(n) = fibonnaci(n - 2) + fibonnaci(n - 1)
。我们只是用代码来表示这种关系。因此对于fibonnaci(7)
我们可以观察到:
-
fibonacci(7)
等于fibonacci(6)
+ fibonacci(5)
-
fibonacci(6)
等于fibonacci(5)
+ fibonacci(4)
-
fibonacci(5)
等于fibonacci(4)
+ fibonacci(3)
-
fibonacci(4)
等于fibonacci(3)
+ fibonacci(2)
-
fibonacci(3)
等于fibonacci(2)
+ fibonacci(1)
-
fibonacci(2)
等于fibonacci(1)
+ fibonacci(0)
-
fibonacci(1)
等于 1
-
fibonacci(0)
等于 1
我们现在拥有评估所需的所有部件fibonacci(7)
,这是我们最初的目标。请注意,基本情况 -- return 1
when n < 2
——这就是让这一切成为可能的原因。这就是停止递归的原因,以便我们可以开始展开堆栈并对每一步返回的值求和的过程。如果没有这一步,我们将继续调用fibonacci
值越来越小,直到程序最终崩溃。
添加一些日志语句来说明这一点可能会有所帮助:
function fibonacci(n, c) {
var indent = "";
for (var i = 0; i < c; i++) {
indent += " ";
}
console.log(indent + "fibonacci(" + n + ")");
if (n < 2) {
return 1;
} else {
return fibonacci(n - 2, c + 4) + fibonacci(n - 1, c + 4);
}
}
console.log(fibonacci(7, 0));
Output:
fibonacci(7)
fibonacci(5)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(4)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(6)
fibonacci(4)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(5)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(4)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
将同一缩进级别的值相加,以生成前一缩进级别的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)