• ベストアンサー

再帰処理について

皆さんのお知恵をお借りしたく、質問させていただきます。 現在C#を学習中なのですが、今再帰処理で悩んでいます。長い再帰処理の時によく処理を中断できたらなぁ、と思うことがあるのですが、そんなことできるのでしょうか?中断、もしくは一時的にアプリを終了させ、後日、その中断したところから再帰処理を再開、なんてことができるのか知りたいのです。 もしできるのであれば、具体的な方法を教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.2

出来ないと思ってください(厳密に言えば出来るが、非常に高度なテクニックが必要) 以下、分かり易く説明すると・・・ ご質問は”プログラムを途中から(しかも不定な場所から)走らせることが出来ますか?”と聞かれているのと同じです。 と考えれば、出来ないことが何となくわかると思います。 仮に中断したPC(プログラムカウンタ)を保存し、そこから再開させるという手段を講じてもスタックの問題があります。 関数の戻り先や関数内で使用する自動変数は、スタック領域に置かれプログラム終了と同時に他に開放されます。 よって、再開した時は元の領域の値は不定です。 再帰関数で言えば、実行中の関数がどの関数のどこに戻れば良いのか等の情報が消滅してしまうのです。 中断時点で静的なメモリ領域に情報全てを確保する手もありますが、これをやると他のアプリが迷惑を被る可能性もあります。

ipsum11
質問者

お礼

やはり無理ですか... >厳密に言えば出来るが、非常に高度なテクニックが必要 そこまで自分の実力をつけたいですね。 でもすっきりしました! ありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

一般的にはできないと思います。 再帰処理の状態はスタック上にあるからです。 末尾再帰のようなループを再帰で表現したような場合は、 現在の状態を保存することで再開することができるかもしれません。 また、かなり大掛かりになってしまいますが、 例えば、ヴァーチャルマシンのような仮想CPU(あるいはシミュレータとかインタプリタ)上でのプログラムの実行を行うようなプログラム(あるいは類似のシステム)を作れば、実行状態のスナップショットを保存すれば、継続できると思います。

ipsum11
質問者

お礼

やはり無理ですか... 仮にやるにしても大掛かりになりそうですね。 でもすっきりしました! ありがとうございました。

関連するQ&A