我似乎不理解这段代码的输出:
function fib(x) {
return (x === 0 || x === 1) ? x : fib(x - 1) + fib(x - 2);
}
fib(7);
// output is 13
这是我的思考过程:
该功能如何得到13的结果?
答案 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
的概念更加清晰!!
答案 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)
的计算逻辑和顺序:
尝试为fib(6)绘制相同的图,然后为fib(7)绘制,您将更好地理解递归。
并且很快得出结论,如果你的目标是实际计算斐波那契数字,这是一个非常低效的算法
(来自an other answer of mine on a related question的图片和修改后的图片,图片来自http://composingprograms.com/pages/28-efficiency.html)