假设我有myFunction($ var)。它会操纵$ var,在最终返回$ var之前调用自己3次。有没有办法在不存储参数调用次数的情况下执行此操作?
答案 0 :(得分:2)
两个相互竞争的方法:
答案 1 :(得分:2)
这样做的一种方法是使n
成为可选项,如果未定义则默认为3。我不知道这个的PHP语法,但因为它的标记语言不可知这里的javascript等价物:
function myFunction (var, n) {
if (n == undefined) {
n = 3;
}
doSomethingWith(var);
n--;
if (n) {
myFunction(var, n);
}
}
// called like this:
myFunction(someVar);
答案 2 :(得分:1)
您可以使用静态语句设置var并在每次进入时检查其值(每次递增时,当然,在您输入时递增,在您退出时递减)。 这是一篇关于基本概念的文章。 http://www.bellaonline.com/articles/art29070.asp
相关代码是
function count_calls( )
{
static $no_calls = 0;
$no_calls++;
echo "This function has been called $no_calls times.";
}
答案 3 :(得分:0)
你没有说在递归调用之后会发生什么,所以......
setrlimit(RLIMIT_STACK)
为一个小值和/或在其他调用中消耗足够的堆栈空间myFunction()
在中止之前只能递归3次,因为缺少堆栈空间。
答案 4 :(得分:0)
某些函数式语言支持这种构造。
在Mathematica中,您可以定义:
f[i_, n_: 3] := Nest[# + 7 &, i, n];
其中3是n的默认值。
所以
f[2]
返回
23 -> (2+7+7+7)
和
f[4,1]
返回
11 (-> 4+7)
当然你也可以定义
f[i_] := Nest[# + 7 &, i, 3];
如果您不需要调整递归调用的数量。
也许这更有趣。您也可以询问所有中间结果。
所以,如果你定义:
g[i_, n_: 3] := NestList[# + 7 &, i, n];
然后
g[2] Returns {2, 9, 16, 23}
答案 5 :(得分:0)
如果你知道你的函数会三次调用自己,有四个时间你调用它,那么最好做一个更简单的非递归函数并使调用显式:
simpleF(simpleF(simpleF(simpleF($var))))
不太优雅,但更易维护。
当然,这不会扩大到更大的数字。