function f($n)
{
if ($n == 0 || $n == 1)
return 2;
return f($n-1) + f($n-2);
}
echo f(5);
这给了我16
,但我不明白为什么。
我知道它是这样的:
return f(4) + f(3)
return f(4) + f(3)+ f(3) + f(1)
但现在由于n
的值为1
,因此应返回2
。
所以它基本上是
return f(4) + f(3)+ f(2)
哪个应该是9
,但它会给我16
。
有人可以解释一下吗?
答案 0 :(得分:5)
f(5) = f(4) + f(3)
= f(3) + f(2) + f(2) + f(1)
= f(2) +f(1) + f(1) + f(0) + f(1) + f(0) + 2
= f(1)+f(0)+ 2 + 2 + 2 + 2 + 2 + 2
= 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
= 16
希望上面的解释能解释价值16
答案 1 :(得分:1)
f(0)=2
f(1)=2
f(2)=f(1)+f(0)=2+2=4
f(3)=f(2)+f(1)=4+2=6
f(4)=f(3)+f(2)=6+4=10
f(5)=f(4)+f(3)=10+6=16
答案 2 :(得分:1)
这是递归函数的直观表示,显示每次迭代的返回值
f(5) 1st
/ \
/ \
/ \
/ \
/ \
/ \
f(4) + f(3) 2nd
/ \ / \
/ \ / \
f(3) + f(2) + f(2) +f(1) 3rd
/ \ / \ / \ |
f(2)+f(1)+f(1)+f(0) + f(1)+f(0)+ 2 4th
/ \ | | + | | | |
f(1)+f(0)+2 + 2 + 2 + 2 + 2 + 2 5th
| | | | | | | |
2 + 2 +2 + 2 + 2 + 2 + 2 + 2 = 16 Result
答案 3 :(得分:0)
这是一个更容易阅读的计算细分:
f(5 - 1) + f(5 - 2)
(f(4 - 1) + f(4 - 2)) + (f(3 - 1) + f(3 - 2))
((f(3 - 1) + f(3 - 2)) + (f(2 - 1) + f(2 - 2))) + ((f(2 - 1) + f(2 - 2)) + 2)
Above simplifies to:
((f(2) + 2) + (2 + 2)) + ((2 + 2) + 2)
Then to:
((f(2) + 2) + 4) + (6)
Then remove extra parenthesis:
f(2) + 2 + 4 + 6
Then simplify:
f(2) + 12
Continuing:
f(2 - 1) + f(2 - 2) + 12
Simplify:
2 + 2 + 12 = 16
答案 4 :(得分:0)
每次调用递归函数并传递大于1
的值时,都会得到一个" fork" (或后续的递归调用)。
简明语法:(Demo)
function f($n){
return $n<2 ? 2 : f($n-1)+f($n-2);
}
当f(1)
时,没有分叉。返回2
当f(2)
时,只有一个前叉。返回4
(LHS = 2 RHS = 2)
当f(3)
时,在初始分支之后,有一个后续的fork @ LHS分支。返回6
(LHS = 4 RHS = 2)
f(4)
时,在初始分叉后,有3个分叉:2xLHS&amp; 1xRHS。返回10
(LHS = 6 RHS = 4)
f(5)
时,在初始分叉后,有6个分叉:4xLHS&amp; 2X $ RHS。返回16
(LHS = 10 RHS = 6)