PHP 中的递归与迭代

2022-08-30 17:11:45

迭代阶乘函数:

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));
    }
}

我必须开发一个函数来计算PHP程序中的阶乘。我发现我可以用上述两种方式做到这一点。

  • 我不知道的是,使用哪种方法更好,为什么?
  • 行业标准是什么?
  • 如何在上述两种方法之间选择一种方法?
  • 确定哪一个更好的条件是什么?

我知道这是很多问题,但由于我是PHP的新手,希望有人能帮助我。

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

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


答案 1

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

PHP将(在我的系统上)seg error试图找到100,000的阶乘,但迭代解决方案没有问题。不过,它们几乎都是瞬间执行的。

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

如果我们不是在谈论PHP或其他脚本语言,那么就没有标准。知道如何以两种方式做到这一点是件好事。我会选择任何导致最干净的代码的方法。


答案 2

我不知道的是,使用哪种方法更好,为什么?

经验法则:如果你能迭代地写它,那就使用它。这是因为函数调用和递归在PHP中会带来一些惩罚。此外,PHP本身并不附带递归保护,并且您可能会在大数字上耗尽内存。

行业标准是什么?

据我所知,没有计算阶乘的行业标准。一般来说,行业标准不会如此详细;如果他们这样做,那就太好了。

如何在上述两种方法之间选择一种方法?

无论函数的真实性质如何,您都可以自己得出结论,即哪个更好,只需在输入域上运行函数并对两者都进行基准测试即可。

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

记忆力和时间是重要的因素。您应该尝试实现低内存消耗和短执行时间。这并不总是可能的,在这种情况下,您需要妥协任何一个。

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


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

function fact($n, $r = 1)
{
    if ($n < 2) {
        return $r;
    } else {
        return fact($n - 1, $r * $n);
    }
}

推荐