如何递归函数本身?

时间:2013-12-15 23:53:46

标签: php

对于前。如果我有一个函数rand(0,2)。我如何建立一个这样的功能

RESC(100,兰特(0,2));

将rand(0,2)的值打印100次?对于这个问题。任何可打印的功能。

我试过了。但似乎没有用。

<?php
function resc($i, $f) {
    if ($i != 0) {
        print $f;
        return resc($i-1, $f);
    } else { 
        print $f;
    }
}
resc(4, rand(0, 1));
?>

2 个答案:

答案 0 :(得分:4)

如果您只想打印一堆随机的内容:

function resc_int($recursions, callable $func, $args = array()) {
    for($i = 0; $i < $recursions; $i++) {
        echo call_user_func_array($func, $args);
    }
}
// resc_int(100, "rand", array(0, 1));

完全未经测试。警告Lector。

这种方法的工作方式是不使用递归(它将使用越来越多的内存,你有更多的递归,因为你不能用活动引用垃圾收集一些东西,否则你将在PHP中获得分段错误,如果它尝试访问它),它使用迭代。

从某种意义上说,有两种“循环”。

循环/递归。

技术上,递归是一个循环,因为你继续递归直到达到停止条件(否则你会得到一个无限循环,这对于相当痛苦的原因是不好的)。 PHP中的循环结构是{​​{1}}。

迭代

在几乎所有情况下(除非你有非常好的理由),当你需要循环的东西时,这总是更好的选择。简单地说,迭代是向上或向下计数到目标整数。这是while()构造;因此,也是for()构造,它使用数组中的元素数作为目标整数,然后计算它,从数组中挑选元素。

这样可以提高内存效率,并且非常容易在PHP中使用。它也可以无限循环,就像可以(只是给它一个不可能的条件来努力),所以要小心。

简而言之:享受标准库(几乎每个你经常需要的功能都在某处),并记住递归是你的 last 选项,而不是第一个。

答案 1 :(得分:0)

function resc($times, $cbFtn, Array $cbFtnArgs = array()) {

    if ($times != 0) {
        print call_user_func_array($cbFtn, $cbFtnArgs);
        resc($times - 1, $cbFtn, $cbFtnArgs);
    }

}

resc(4, 'rand', array(0, 1));