3

私はここで新しく、私を悩ませている問題があります。私は初心者なので、私を笑わないでください。再帰的なクイックソートを多数の要素(たとえば100000)で機能させたいのですが、これによりスタックがオーバーフローすることがわかっています。ここ数日、コールスタックを管理する方法を探しています。本当に良い情報源を見つけることはできません。私の考えは、最初の関数呼び出しに戻る最後の呼び出しを除いて、各再帰呼び出しの戻りアドレスを削除することです。それが可能かどうか、またはこの問題の別の解決策であるかどうかはわかりません。

PS:クイックソートを再帰的に保ちたいです。

私の問題がばかげているように見えたら申し訳ありませんが、私は適切な答えを理解する必要があります。英語が下手でごめんなさい。ありがとうございました!

4

4 に答える 4

3

配列内の100000アイテムは何もないことに注意してください。これにより、ネストされた呼び出しが17関数の深さでのみ発生します。

$ echo "l(100000)/l(2)" | bc -l
16.60964047443681173951

つまりlog(N)/log(2)log(2)ログベース2に変換することです。

再帰関数呼び出しをサポートするプラットフォームは、ほぼ確実に17のネストされた呼び出しを処理できます。

于 2012-04-03T23:44:48.410 に答える
3

再帰アルゴリズムでスタックスペースが不足するという問題を解決する標準的な方法は、代わりに反復的に実装することです。

于 2012-04-03T23:34:22.847 に答える
1

スタックスペースが問題であるがメモリは一般的に問題ではない場合は、独自のヒープ割り当てスタックを使用して、再帰的な実装を反復的な実装に簡単に変換できます。つまり、再帰的な関数呼び出しを行う代わりに、関心のある引数を独自のスタックデータ構造にプッシュします。次に、スタックを反復処理して、引数の各セットを処理できます。

于 2012-04-03T23:41:03.703 に答える
0

here で説明されている末尾再帰を実行しようとしているようです。

C の末尾再帰

于 2012-04-04T08:41:35.210 に答える