2011-10-27 8 views
8

C++では、再帰関数で再帰呼び出しが多すぎてスタックオーバーフローエラーが発生したとします。C++は継続継承スタイルをどのように使用できますか?

スタックオーバーフローを避けるために、これを継続渡しスタイルでどのように書き換えますか?

C++でこれを説明するのに少し問題があります。

+2

このような抽象的な質問については、抽象的な回答以外は何も得られません。たぶんスタックオーバーフローの原因となっている関数の例を投稿して、それを修正する方法について具体的な回答を得られるはずです。 (そして個人的には、アキュムレータを使用してそれを書き換えてから継続するように書き直そうとしています...) – ildjarn

+0

あなたは正しい場所に来ました。 –

+0

@ildjarn、通知のおかげで。私は抽象的な答えを実際に探しています。アキュムレータを使用すると、C++の通常の反復処理として書き直すことはできませんか? – achow

答えて

4

これはかなりオープンな質問ですが、Eric Lippertは実際にはlong series about exactly this topicと書いています。必ずしも正しい言語ではありませんが、それはまだまだ役立ち、一般的な考え方を与えるべきです。

CPSをC++で実装すると、単一の再帰関数を修正するだけの多くの作業のようですが、キューを使用して関数を反復するためのアルゴリズムを使用することができます(基本的に同じ量のデータを使用しますヒープははるかに制限されていません)。

+1

私は、組み込みの言語機能として字句クロージャを持つ言語の文脈で、これらのシリーズを両方書くことのはっきりとした利点がありました。 C++コードをクロージャーに書き直すことはもちろん完全に達成可能ですが、それは少し苦しいでしょう。 –

+1

@EricLippertあなたは正しく私はC++ 11のlambdaを想定していましたが、明らかに誰も(大多数には至っていません)ラムダをサポートするコンパイラを持っていません。それがなければ、はるかに複雑になります(クラスを使用し、おそらく周りのものを渡しますか?)。 Btwあなたの素晴らしい記事をありがとう - 私はCPSが何であるか知りませんでした:) – Voo

+2

@Voo:C++ 11ラムダがなくても、これを簡単に処理するC++ 03ライブラリがあります。例えば、 [Boost.Phoenix](http://www.boost.org/libs/phoenix/)。 – ildjarn

関連する問題