n 大数的阶乘问题

n factorial issue with large number

我写了下面的代码来寻找 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. 在我的一台电脑上,

Fatal error: Maximum function nesting level of '100' reached, aborting!

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

  1. 在其他电脑上,

INF

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

P.S.: 我已经在整个网站上浏览了各种解决方案,但我无法得出结论。

更新: 有一个 function 建议。但是可以不使用任何一种功能来完成吗?

嵌套限制:

如果 calcFactorial() 可以非递归那么你可以把它改成这样:

function calcFactorial($number){

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

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

如果必须递归,你永远无法计算大于最大函数嵌套级别的数字的阶乘。

信息:

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

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

来确认

你可以尝试通过将数字存储为字符串(数字)或数组(数字)来解决这个问题,而不是编写一些函数来对这个字符串(数组)进行乘法运算,但这并不容易