php函数调用自己

时间:2013-02-24 17:44:05

标签: php function

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

2 个答案:

答案 0 :(得分:2)

nneonneo应该刚刚发表他的评论作为答案,但是,这就是递归概念的工作原理:

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