为什么答案,13给出。我只是无法理解它。
如果给定输入为7,则以下函数返回什么:
function foo($bar) {
if ($bar == 1) return 1;
elseif ($bar == 0) return 0;
else return foo($bar - 1) + foo($bar - 2);
}
正确答案:D。13
答案 0 :(得分:2)
FOO(7) = foo(6)+ foo(5)
但等等,那些等于什么?
foo(6)= foo(5)+ foo(4)
Sonofagun!
foo(5)= foo(4)+ foo(3)
嗯......正在出现一种模式..
foo(4)= foo(3)+ foo(2)
foo(3)= foo(2)+ foo(1)
foo(2)= foo(1)+ foo(0)
foo(1)= 1
和
foo(0)= 0.
所以现在你可以向后看到值,但是(这是更重要的问题)当你再次将$ bar增加1时真正发生了什么?
foo(8)与foo(7)相比如何?
答案是foo(8)等于foo(7)+ foo(6)。换句话说,它等于13 + 8 - foo的两个先前输出的总和..嘿,听起来很熟悉......是否有一些着名的序列等于前两个数字的总和?
1,2,3,5,8,13 ......
这是正确的,这就是你如何递归计算Fibonacci序列。如果你考虑如何构建Fibonacci序列,那真的是
1,1 + 1,2 + 1,3 + 2,5 + 3 + 5
这只是
1,1 + 1,(1 + 1)+ 1,(2 + 1)+(1 + 1)等
通过“播种”初始值(位置“0”为0,位置1为1)然后将它们加在一起,您可以仅使用原始种子和大量添加来导出序列中的每个数字。
因此,在这种情况下,bar表示Fibonacci序列中的柱位置。所以序列中的第7个数字是13。
答案 1 :(得分:1)
这很简单,只需手动追踪序列即可。当使用这种类型的递归时,有助于将其视为数学函数而不是编程过程。如果你想更自然地了解它,使用功能语言* ML或一些LISP可以帮助你很快很快。 当你对数据结构(Stack / Queue)进行递归时,它有点不同,但函数式编程经验也有帮助。
foo(0)
= 0
foo(1)
= 1
foo(2)
= foo(1)
+ foo(0)
= 1 + 0 = 1
foo(3)
= foo(2)
+ foo(1)
= 1 + 1 = 2
foo(4)
= 2 + 1 = 3
foo(5)
= 3 + 2 = 5
foo(6)
= 5 + 3 = 8
foo(7)
= 8 + 5 = 13