0

为什么答案是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

4

2 回答 2

2

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。

于 2013-02-24T17:58:36.813 回答
1

这很简单,只需手动跟踪序列即可。使用这种类型的递归时,将其更多地视为数学函数而不是编程过程会有所帮助。如果您想更自然地了解它,使用函数式语言 *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

于 2013-02-24T17:52:17.627 回答