递归函数,在不使用n作为参数的情况下调用n次

时间:2010-12-10 04:17:48

标签: php language-agnostic loops recursion

假设我有myFunction($ var)。它会操纵$ var,在最终返回$ var之前调用自己3次。有没有办法在不存储参数调用次数的情况下执行此操作?

6 个答案:

答案 0 :(得分:2)

两个相互竞争的方法:

  1. 静态全球数据
  2. 以一种可以检测操作次数的方式转换$ var

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

不太优雅,但更易维护。

当然,这不会扩大到更大的数字。