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 安装有两个问题。
- 在我的一台电脑上,
Fatal error: Maximum function nesting level of '100' reached,
aborting!
为了更正上述问题,我找到了解决方案 here。这是获得解决方案的正确方法吗?因为它取决于 'xdebug.max_nesting_level' 的特定默认值。
- 在其他电脑上,
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);
来确认
你可以尝试通过将数字存储为字符串(数字)或数组(数字)来解决这个问题,而不是编写一些函数来对这个字符串(数组)进行乘法运算,但这并不容易
我写了下面的代码来寻找 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 安装有两个问题。
- 在我的一台电脑上,
Fatal error: Maximum function nesting level of '100' reached, aborting!
为了更正上述问题,我找到了解决方案 here。这是获得解决方案的正确方法吗?因为它取决于 'xdebug.max_nesting_level' 的特定默认值。
- 在其他电脑上,
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);
来确认你可以尝试通过将数字存储为字符串(数字)或数组(数字)来解决这个问题,而不是编写一些函数来对这个字符串(数组)进行乘法运算,但这并不容易