任何人都可以帮我逐行描绘这个PHP代码:functions&递归

时间:2017-12-12 18:42:33

标签: php

function f2($n, $a)
{
    if ($n == 0)
      return 0;
   return $a + f2($n-1, $a); // Changed return a... to return $a...
}

echo f2(3,4);
这输出12,我只是不明白为什么。不过这是我的想法:

显然,$ n和$ a是代替值的变量。所以在这个例子中,n是3,a是4。基本情况是if语句,它就像n之间的循环。所以因为n是3,并且n被设置为= 0,所以代码循环3次。

现在我得不到返回a + f2(n-1,a)部分。显然这是计算数学的地方,但是如何计算?

它像我想的那样循环:

4 + f2(2, 4)
4 + f2(1, 4)
4 + f2(0, 4)

但它增加了什么使总和12?

所以我要问的是,如果我理解正确,如果没有,那么实际发生了什么以及输出结果如何。

2 个答案:

答案 0 :(得分:5)

第一个电话是f2(3,4)

f2(3,4)
    |
  return 4 + f(2,4)
                |
             return 4 + f(1,4)
                          |
                        return 4 + f(0, 4)
                                       |
                                   return 0; // and now unwinding the stack, 0 gets passed to the prev. return called.
                                       |
                        return 4 +     0   // 4 gets passed to the prev. return called
                          |
             return 4 + 4 + 0         // 8 gets passed to the prev. return called.
                |
  return 4 + 4 + 4 + 0    // f2(3,4) now returns a value of 12

查看上面的调用堆栈,第一个调用的返回将是:

return 4 + 4 + 4 + 0

return a + call f2+运算符将a链接到下一个函数调用,最后在调用的第一个return中累积所有中间值。

答案 1 :(得分:0)

我想在你的"循环解释" ...

中添加以下内容
  

基本情况是if语句,它就像是一个循环   ñ。所以因为n是3,并且n被设置为= 0,所以代码循环3次。

那里没有循环。它只是声明当$ n = 0时函数返回值0.

当减少$ n时,函数在行return a + f2($n-1, $a);调用自身3次会发生什么。

如上所述,当$ n = 0且返回值0时,调用停止。

所以你先调用函数+调用自身3次的函数导致:

4 + f2(2,4)
4 + 4 + f2(1,4)
4 + 4 + 4 + f2(0,4)
4 + 4 + 4 + 0; // 12