想问一下JavaScript函数。
我不理解下面的功能,我认为第4行fib(n-1)
会返回1
而后者fib(n-2)
会返回0
,然后他们都会加在一起为1.
我可以知道为什么f(10);
的最终结果将是55
,但我无法理解这一点。
任何人都可以帮我解释一下幕后发生的事情吗?
谢谢! ;)
var f = function fib(n) {
if (n === 0) return 0;
if (n === 1) return 1;
if (n > 1) return fib(n - 1) + fib(n - 2); // *2
};
f(10); // 55
答案 0 :(得分:8)
喜欢这个。这是一个典型的递归函数,有两个基本案例和一个递归步骤。
请注意,如果n
为10,则fib(n - 1)
为fib(9)
,依此类推:
fib(10) = fib(9) + fib(8) = 34 + 21 = 55
fib(9) = fib(8) + fib(7) = 21 + 13 = 34
fib(8) = fib(7) + fib(6) = 13 + 8 = 21
fib(7) = fib(6) + fib(5) = 8 + 5 = 13
fib(6) = fib(5) + fib(4) = 5 + 3 = 8
fib(5) = fib(4) + fib(3) = 3 + 2 = 5
fib(4) = fib(3) + fib(2) = 2 + 1 = 3
fib(3) = fib(2) + fib(1) = 1 + 1 = 2
fib(2) = fib(1) + fib(0) = 1 + 0 = 1
fib(1) = 1
fib(0) = 0
旁注:尽管您的示例是递归函数的一个很好的例证,但它是计算斐波纳契数的一种非常低效的方法。更好的方法是使用memoization来消除大部分低效率:
var fib = (function () {
var cache = [0, 1];
return function fib(num) {
if (!(num in cache)) {
cache[num] = fib(num - 1) + fib(num - 2);
}
return cache[num];
};
})();
console.log(fib(10));
答案 1 :(得分:0)
这被称为"递归函数"哪一个函数自称。
基本上没有限制(就操作系统而言)这样做,函数基本上被解释/编译为汇编代码,并且可以使用不同(或相同)参数复制和重新运行此汇编代码。