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


11

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

回答:


10

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

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

反復的なものはコンピューティングです

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

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


1

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


1
プログラムを見ましたか?反復階乗は、スタックをまったく操作しません。
AProgrammer

-1

推測できるのは、これらのベンチマークがCからのものかSBLCコードからのものかさえわかりません。私の推測では、犯人は変数を変化させているのでしょう。1000!はかなり大きな数字です。コピーを作成して上書きするよりも、スタックにデータを挿入してクリーンアップする方が速いかもしれません。


それらはSBCLコードからのものだったと思います。
martinjacobd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.