Я написал следующий код для поиска! Я запускаю это через 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.
Неустранимая ошибка: достигнут максимальный уровень вложенности функции «100»,
прерывание!
Чтобы исправить вышеуказанную проблему, я нахожу решение Вот. Это правильный способ найти решение? Потому что это зависит от конкретного значения по умолчанию «xdebug.max_nesting_level».
INF
Так каков наилучший подход к решению этой проблемы?
Постскриптум: Я прошел через различные решения на этом сайте, но я не могу сделать вывод.
ОБНОВИТЬ: Есть один функция предложил. Но можно ли это сделать без использования какой-либо функции?
Предел вложенности:
если 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);
Вы можете попытаться решить эту проблему с помощью сохранения чисел в виде строк (из цифр) или массивов (из цифр), а затем написать некоторую функцию для умножения этих строк (массивов), но это не так просто сделать
Других решений пока нет …