Цитирование из Код завершения 2 ,
int Factorial( int number ) {
if ( number == 1 ) {
return 1;
}
else {
return number * Factorial( number - 1 );
}
}
В дополнение к медленному [1] и созданию
использование оперативной памяти
непредсказуемый [2] , рекурсивная версия
этой рутины труднее
понять, чем итерационная версия,
что следует:
int Factorial( int number ) {
int intermediateResult = 1;
for ( int factor = 2; factor <= number; factor++ ) {
intermediateResult = intermediateResult * factor;
}
return intermediateResult;
}
Я думаю, что медленная часть из-за ненужных накладных расходов на вызов функции.
Но как рекурсия делает использование оперативной памяти непредсказуемым?
Разве мы не можем всегда предсказать, сколько памяти потребуется (как мы знаем, когда рекурсия должна закончиться)? Я думаю, что это было бы так же непредсказуемо, как итерационный случай, но не больше.