web-dev-qa-db-ja.com

反復バージョンに時間がかかるのはなぜですか?

私は http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/ を見ていましたが、階乗の再帰的および反復的な実装の彼の実装でそれを見ました関数の場合、n = 1,000の場合、反復には実際には時間がかかります。理由がわかりません(彼は説明していませんが、読者の練習問題だと言っています)。このすべてに私の新しさをお詫びします。

11
martinjacobd

2つのプログラムは同等ではありません。再帰バージョンはコンピューティングです

(...((1 * 2)* 3)* 4 ... * n)

反復的なものが計算している間

(...((n *(n-1))*(n-2)... * 1)

したがって、反復バージョンでは中間量がより急速に増加し、関係する数値が小さい場合は大きな数値の計算が速くなります(大きな数値なしで1000!を計算しても意味がなく、LISP方言は自動的に大きな数値に切り替わります)。

10
AProgrammer

再帰的アルゴリズムを反復的に行う場合、結果を追跡するスタックを明示的に実装する必要があります。この行為は、再帰的アルゴリズムが無料で取得するスタックのプッシュとポップを処理する追加の操作を追加します(完全に無料ではありませんが、追加の操作は再帰のコスト以上になります)。

1
Michael Brown