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?
所以我要问的是,如果我理解正确,如果没有,那么实际发生了什么以及输出结果如何。
答案 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