描绘php代码函数/递归; 11级功能/递归

时间:2017-12-14 02:38:16

标签: php recursion

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

有人可以解释一下吗?

5 个答案:

答案 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)