Javascript功能。不明白自功能内部的功能如何工作

时间:2015-04-01 08:55:48

标签: javascript function recursion

想问一下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

参考:https://slides.com/concise/js/fullscreen#/35

2 个答案:

答案 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));

http://jsperf.com/fibonacci-memoization-2015-04-01

答案 1 :(得分:0)

这被称为"递归函数"哪一个函数自称。

基本上没有限制(就操作系统而言)这样做,函数基本上被解释/编译为汇编代码,并且可以使用不同(或相同)参数复制和重新运行此汇编代码。