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; }
遅い部分は、不要な関数呼び出しのオーバーヘッドが原因だと思います。
しかし、再帰によってランタイム メモリの使用が予測不能になるのはなぜでしょうか。
どのくらいのメモリが必要になるかを常に予測することはできませんか (再帰がいつ終了するかはわかっています)。反復の場合と同じくらい予測不可能になると思いますが、それ以上ではありません。