为什么答案是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
nneonneo 应该刚刚发布了他的评论作为答案,但是,这就是递归概念的工作原理:
富(7)=富(6)+富(5)
但是等等,那些等于什么?
富(6)=富(5)+富(4)
索诺法根!
富(5)=富(4)+富(3)
嗯..一种模式正在出现..
富(4)=富(3)+富(2)
富(3)=富(2)+富(1)
富(2)=富(1)+富(0)
富(1)= 1
和
富(0)= 0。
所以现在你可以计算出返回值,但是(这是更重要的问题)当你再次将 $bar 增加 1 时真正发生了什么?
foo(8) 与 foo(7) 相比如何?
答案是 foo (8) 等于 foo(7) + foo(6)。换句话说,它等于 13 + 8 - foo 的前两个输出的总和 .. 嘿,这听起来很熟悉...... 是否有一些著名的序列等于前两个数字的总和?
1、2、3、5、8、13 ...
没错,这就是递归计算斐波那契数列的方法。如果你想想你是如何建立斐波那契数列的,那真的是
1, 1 + 1, 2 + 1, 3 + 2, 5 + 3, 8 +5
这只是
1、1 + 1、(1 + 1) + 1、(2 + 1) + (1 + 1) 等。
通过“播种”初始值(位置“0”为 0,位置 1 为 1),然后将它们相加,您可以仅使用原始种子和大量加法来推导序列中的每个数字。
所以在这种情况下,bar 代表斐波那契序列中的 bar 位置。所以序列中的第 7 个数字是 13。
这很简单,只需手动跟踪序列即可。使用这种类型的递归时,将其更多地视为数学函数而不是编程过程会有所帮助。如果您想更自然地了解它,使用函数式语言 *ML 或一些 LISP 会非常快速地帮助您。当您对数据结构(堆栈/队列)进行递归时,情况会有所不同,但函数式编程经验也对此有所帮助。
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