n具有大量

时间:2015-10-07 05:50:03

标签: php recursion factorial

我写了以下用于查找n!的代码。我通过CLI运行它。

<?php 
    $handle = fopen("php://stdin", "r");
    $number = (int) trim(fgets($handle));
    $fact = calcFactorial($number);
    echo $fact . "\n";

function calcFactorial($number) {
    if ($number < 2) {
        return 1;
    } else {
        return $number * calcFactorial($number - 1);
    }
}
fclose($handle);
?>

上面的代码工作正常。但是有两个不同的PHP安装有两个问题。

  1. 我在一台电脑上
  2.   

    致命错误:达到最大功能嵌套级别'100',   中止!

    要纠正上述问题,我找到解决方案here。这是获得解决方案的正确方法吗?因为它取决于'xdebug.max_nesting_level'的特定默认值。

    1. 我在其他电脑上
    2.   

      INF

      那么解决这个问题的最佳方法是什么?

      P.S。:我在整个网站上都经历过各种解决方案,但我无法做出结论。

      更新:建议提出一个function。但是可以在不使用任何功能的情况下完成吗?

1 个答案:

答案 0 :(得分:1)

嵌套限制:

如果calcFactorial()可以非递归,则可以将其更改为:

function calcFactorial($number){

    if($number<2){
        return 1;
    }

    $ret = 1;
    for($i=2;$i<=$number;$i++){
        $ret = $ret*$i;
    }
    return $ret;
}

如果必须递归,你永远不能计算出比最大函数嵌套级别更大的阶乘数。

INF:

这意味着PHP认为数字是不定式的(大到存储在内存中)...我认为(不确定)答案大于PHP_INT_MAX ......

您可以通过echo is_infinite($ number);

确认

您可以尝试将数字存储为字符串(数字)或数组(数字),然后编写一些函数来使这些字符串(数组)相乘,但这样做并不容易