Цитата из Code Complete 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; }
Я думаю, что медленная часть связана с ненужными накладными расходами на вызов функций.
Но как рекурсия делает непредсказуемым использование оперативной памяти?
Разве мы не всегда можем предсказать, сколько памяти потребуется (поскольку мы знаем, когда предполагается, что рекурсия закончится)? Я думаю, что это было бы так же непредсказуемо, как итеративный случай, но не более того.