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要实现尾部递归优化,您可以这样编写阶乘函数:
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
?