Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的递归与迭代_Php_Loops - Fatal编程技术网

PHP中的递归与迭代

PHP中的递归与迭代,php,loops,Php,Loops,迭代阶乘函数: function factorial($number) { $result = 1; while ($number > 0) { $result *= $number; $number--; } return $result; } function factorial($number) { if ($number < 2) { return 1; } else {

迭代阶乘函数:

function factorial($number) {
    $result = 1;
    while ($number > 0) {
        $result *= $number;
        $number--;
    }
    return $result;
}
function factorial($number) {
    if ($number < 2) {
        return 1;
    } else {
        return ($number * factorial($number-1));
    }
}
递归阶乘函数:

function factorial($number) {
    $result = 1;
    while ($number > 0) {
        $result *= $number;
        $number--;
    }
    return $result;
}
function factorial($number) {
    if ($number < 2) {
        return 1;
    } else {
        return ($number * factorial($number-1));
    }
}
函数阶乘($number){
如果($number<2){
返回1;
}否则{
返回($number*阶乘($number-1));
}
}
我必须在PHP程序中开发一个计算阶乘的函数。我发现我可以用以上两种方法来做

  • 我不知道哪种方法更好,为什么
  • 行业标准是什么
  • 如何在以上两种方法中选择一种
  • 决定哪一个更好的条件是什么
我知道有很多问题,但因为我是PHP新手,希望有人能帮我解决

鉴于此,实际上我使用的函数不仅仅是阶乘。它还有一些其他的线路来完成其他的任务。为了简化起见,我们假设这是两个函数。所以任何人都可以理解我的问题,而不是无缘无故地把它复杂化

我基本上指的是PHP中的递归与迭代

我不知道哪种方法更好,为什么

经验法则:如果您可以迭代编写,请使用它。这是因为函数调用和递归在PHP中会受到一些惩罚。此外,PHP本身并没有递归保护,而且在处理大量数据时可能会出现内存不足的风险

行业标准是什么

据我所知,没有计算阶乘的行业标准。一般来说,行业标准不涉及这些细节;如果有,那就太好了

如何在以上两种方法中选择一种

独立于函数的真实性质,您也可以通过在输入域上运行函数并对两者进行基准测试,得出自己认为哪一个更好的结论

决定哪一个更好的条件是什么

记忆和时间是重要的因素。您应该尽量实现低内存消耗和短执行时间。这并不总是可能的,在这种情况下,您需要折衷其中任何一个

也就是说,我会选择迭代解决方案


顺便说一句,如果PHP要实现尾部递归优化,您可以这样编写阶乘函数:

function fact($n, $r = 1)
{
    if ($n < 2) {
        return $r;
    } else {
        return fact($n - 1, $r * $n);
    }
}
函数事实($n,$r=1)
{
如果($n<2){
返回$r;
}否则{
返回事实($n-1,$r*$n);
}
}

据我所知,第一种方法比递归好。因为它会给系统带来大量开销,有时还会停止脚本。

Php是一个特例。使用迭代解决方案将使用更少的内存。此外,PHP中的函数调用代价高昂,因此最好尽量避免函数调用

PHP将seg fault(在我的系统上)尝试查找100000的阶乘,但迭代解决方案没有问题。不过,这两种方法实际上都是瞬间执行的

当然,一个小得多的数字的阶乘是
INF
,但这也可以应用于一个增长缓慢得多的函数


如果我们不是在谈论PHP或其他脚本语言,那么就没有标准。知道如何做到这两个方面很好。我会选择最干净的代码。

我创建了一个脚本来测试哪种方法更快

$f = 12; //calculate factorial of this number
$n = 10000000; //the number of times the process is repeated

//factorial using iterative function
function f1($a) {
    $r = $a;
    for($i=$a-1; $i >= 2; $i--)
        $r *= $i;
    return $r;
}

//factorial using recursive function
function f2($a) {
    return $a < 2 ? 1 : $a * f2($a - 1);
}

echo "\n\n";

$start = microtime(true);
for($i=0; $i < $n; $i++)
    $x = f1($f);
echo "f1(): " . ((microtime(true) - $start) * 1000) . " ms\n";

$start = microtime(true);
for($i=0; $i < $n; $i++)
    $x = f2($f);
echo "f2(): " . ((microtime(true) - $start) * 1000) . " ms\n";

除了递归使用更多内存之外,它大约比迭代慢1.87倍。在PHP7上测试。

当有疑问时,不要在PHP中使用递归:)如果您在中看到注释,您应该有自己的答案。没有“标准”。有些程序可以更优雅地以递归形式编写。有些人不能。递归的一个缺点是它为每个函数调用生成一个堆栈帧。如果这些函数足够多,就会出现堆栈溢出。行业标准通常会使用内置函数。gmp_fact(n)@Dasum:这个问题与哪个特定的PHP5版本有关?@NullUserException存在,递归是函数的最后一个语句,因此替换堆栈是安全的。在递归调用执行之前,您神奇地将其结果乘以
$number