使用Javascript坚持一个简单的斐波那契

时间:2017-10-15 12:36:36

标签: javascript

我似乎不理解这段代码的输出:

function fib(x) {
  return (x === 0 || x === 1) ? x : fib(x - 1) + fib(x - 2);
}

fib(7);
// output is 13

这是我的思考过程:

  • 将int传递给函数并检查它是0还是1
  • 如果为0或1,则继续返回传递的值
  • 如果它不是0或1,则从7减去1,然后从7
  • 减去2
  • 返回根据我的(显而易见的错误)思维将是11
  • 的输出

该功能如何得到13的结果?

4 个答案:

答案 0 :(得分:4)

--------------------------------------------------------------
| Step  | Function | Result                                 |
--------------------------------------------------------------
|  1    | f(7)     | f(6) + f(5) = a
|  2    |   a      | [f(5)+f(4)] + [f(4)+f(3)] = b
|  3    |   b      | [ [f(4)+f(3)] + [f(3)+f(2)] ] + [ [(f(3)+f(2)] + [f(2)+f(1)] ] = c
|  4    |   c      | [ [ [f(3)+f(2)] + [f(2)+f(1)] ] + [ [f(2)+f(1)] + [f(1) + f(0)] ] ] + [ [ [f(2)+f(1)]  + [f(1) + f(0)] ] + [ [f(1) + f(0)] + 1] ] = d
|  5    |   d      | [ [ [ [f(2)+f(1)]  + [f(1) + f(0)] ] + [ [f(1) + f(0)] +1] ] + [ [ [f(1) + f(0)] +1] + [1 + 0] ] ] + [ [ [ [f(1) + f(0)] +1]  + [1 + 0] ] + [ [1 + 0] + 1] ] = e
|  6    |   e      | [ [ [ [ [f(1) + f(0)] +1]  + [1 + 0] ] + [ [1 + 0] +1] ] + [ [ [1+ 0] +1] + [1 + 0] ] ] + [ [ [ [1 + 0] +1]  + [1 + 0] ] + [ [1 + 0] + 1] ] = f
|  7    |   f      | [ [ [ [ [1 + 0] +1]  + [1 + 0] ] + [ [1 + 0] +1] ] + [ [ [1+ 0] +1] + [1 + 0] ] ] + [ [ [ [1 + 0] +1]  + [1 + 0] ] + [ [1 + 0] + 1] ] = g

g= 13 

答案 1 :(得分:3)

If it's not 0 or 1, minus 1 from 7, then minus 2 from 7 这是错误。它将递归,堆栈将被建立(意味着将调用更多fib()函数)。如果你想要一个笔和纸解决方案,这里就是。一切都是从左到右完成的,请注意。我已经展示了x=4的一个简单示例。尝试将其扩展为x=7。将使recursion的概念更加清晰!!

enter image description here

答案 2 :(得分:1)

欢迎来到美丽的递归世界。这可能是一个难以理解的概念,但是当你最终理解它时会非常有益。

@Elif A编写了一个很好的表格,可以准确显示程序的运行方式。然而,当我自己学习递归时,我采用了这种策略,我在一张纸上“映射”了所有输入,从给出一个值的输入开始,而不是函数调用。然后我建立起来。如果你很难理解递归,我真的推荐这个策略。

考虑以下代码

function factorial(n) {
      if (n == 1) {
             return 1;
       }
       else {
             return n*factorial(n-1)
       }
}

让我们说我们想找factorial(5)。评估factorial(5)时,不要从顶部开始,而是从底部开始,向前迈进factorial(5)。你会明白为什么这是一种理解递归的直观方式。

factorial(1) = 1

factorial(2) = 2 * factorial(1) = 2 * 1 = 2

factorial(3) = 3 * factorial(2) = 2 * 3 = 6

factorial(4) = 4 * factorial(3) = 4 * 6 = 24

factorial(5) = 5 * factorial(4) = 5 * 24 = 120

再次,让我确切地说,这只是理解递归的一种方式。我提到的表是程序实际运行的方式,并进行递归。

答案 3 :(得分:0)

你忘记了如果 fib (6)+ fib (5),而不是6 + 5

,会返回什么

此架构可以帮助您了解fib(5)的计算逻辑和顺序:

recursive Fibonacci function for fib(5)

尝试为fib(6)绘制相同的图,然后为fib(7)绘制,您将更好地理解递归。

并且很快得出结论,如果你的目标是实际计算斐波那契数字,这是一个非常低效的算法

(来自an other answer of mine on a related question的图片和修改后的图片,图片来自http://composingprograms.com/pages/28-efficiency.html