描述php代码函数/递归;11级函数/递归

描述php代码函数/递归;11级函数/递归,php,recursion,Php,Recursion,这给了我16,但我不知道为什么 我知道是这样的: function f($n) { if ($n == 0 || $n == 1) return 2; return f($n-1) + f($n-2); } echo f(5); 但是现在由于n的值是1,它应该返回2 所以本质上是 return f(4) + f(3) return f(4) + f(3)+ f(3) + f(1) 应该是9,但它给了我16 谁能解释一下怎么做 return f(4) + f(3)+

这给了我
16
,但我不知道为什么

我知道是这样的:

function f($n)
{
   if ($n == 0 || $n == 1)
      return 2;
   return  f($n-1) + f($n-2);
}

echo f(5);
但是现在由于
n
的值是
1
,它应该返回
2

所以本质上是

return f(4) + f(3)
return f(4) + f(3)+ f(3) + f(1)
应该是
9
,但它给了我
16

谁能解释一下怎么做

return f(4) + f(3)+ f(2)
希望以上解释能解释16的价值

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的值,这里有一个更容易阅读的计算分解:

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
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

以下是更易于阅读的计算明细:

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

下面是递归函数的可视化表示,显示了每次迭代的返回

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

下面是递归函数的可视化表示,显示了每次迭代的返回

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

每次调用递归函数并传递大于
1
的值时,都会得到一个“fork”(或后续递归调用)

压缩语法:()

函数f($n){

返回$n每次调用递归函数并传递大于
1
的值时,您都会得到一个“fork”(或后续递归调用)

压缩语法:()

函数f($n){


return$nw您为什么会得到
9
?函数的每个最终返回值都是
2
,因此不确定您为什么会期望奇数。因为我以为您要添加值,所以它是4+3+2;您能详细说明它是16吗?f5=f4+f3=f3+f2+f2+f1=f2+f1+f1+f1+f1+f1+2=f1+f0+12=16@jh1711你能解释一下你是怎么得到这个的吗让我们从另一个角度开始:
f(2)=f(1)+f(0)=2+2=4
。我们同意f(2)吗是4?为什么会得到
9
?函数的每个最终返回值都是
2
,所以不确定为什么会出现奇数。因为我以为你要加上这些值,所以它是4+3+2;你能详细说明它是16吗?f5=f4+f3=f3+f2+f2+f1=f2+f1+f1+f1+f1+f1+2=f1+f0+12=16@jh1711你能解释一下你是怎么做到的吗?让我们从另一个角度开始:
f(2)=f(1)+f(0)=2+2=4
。我们同意f(2)吗是4吗?我正在研究一个类似的答案,但是就像你的答案的布局一样,在顶行,f4+f3,我得到了,因为5-1=4,5-2=3,但是第二个:f3+f2+f2;这是怎么工作的?你不需要也减去2吗?另一个f2来自哪里?这是一个递归,所以你在第一行中得到f4+f3的方式,你将以同样的方式得到t f3和f2表示f4,f2和f1表示f3:如第2行所示。依此类推。按照我的答案中的代码,你会得到一个更好的画面。我正在研究一个类似的答案,但就像你的答案的布局一样,在顶行,f4+f3,我得到了,因为5-1=4,5-2=3,但第二个:f3+f2+f2;这是怎么回事?你没有t吗o也减去2?另一个f2是从哪里来的?这是一个递归,所以你在第一行得到f4+f3的方式,同样的方式你会得到f4的f3和f2,f3的f2和f1:如第2行所示。依此类推。按照我的答案中的代码,你会得到一个更好的图片。很好的一个;垂直表示很好,很干净。+1好的一个;垂直表示是好的和干净的。+1