web-dev-qa-db-ja.com

C#の再帰の深さ-どれだけ深くできるか

再帰的に何かを呼び出すことができる制御はありますか?

基本的なテストプログラムから、再帰の深さが18kを少し超えた

これはスタックサイズに依存します...

再帰の深さを増やすために大規模なスタックでメモリのチャンク(おそらくスレッド)をセットアップする方法はありますか?

49
Keith Nicholas

一部のドキュメントの認識中にスタックサイズを増やしました。それは本当に必要でした。

したがって、次のコードを使用してスレッドのスタックサイズを増やすことができます。

var stackSize = 10000000;
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize);

Thread(ThreadStart、Int32)-スレッドの最大スタックサイズを指定して、Threadクラスの新しいインスタンスを初期化します。

ソース

これがあなたが必要とするものであることを願っています。

48
Andrew Orsich

ここで問題のリスクを冒していると思います。再帰アルゴリズムが使用するスタックの量を正確に決定することは困難です。そして、あなたが十分であるかどうかについていくつかの質問があるところまでなら、私は別のアプローチを探します。

ほとんどの再帰的アルゴリズムは、再帰的でないように書き直すことができます。その後、必要なだけメモリを割り当て、十分でない場合は正常に回復できます。

20
Jonathan Wood

デフォルトのスタックサイズはPEヘッダーに格納されます。

自分でスレッドを生成する場合、Threadには、スタックサイズをパラメーターとして取るコンストラクターがあります。

ただし、ほとんどのタスクではデフォルトの.NETスタックサイズ1 MBで十分なので、変更する前に少なくともタスクを確認する必要があります。

5
Brian Rasmussen

再帰の深さを大きくできたとしても、パフォーマンス上の理由から、このアルゴリズムは再帰なしで実装します。メソッドの呼び出しは、whileループ内の反復よりもはるかに負荷がかかります。デフォルトのスタックサイズをいじる必要があるものを実装しないことを強くお勧めします。

私はときどき再帰を使用しますが、コールデプスが定義されていて低い場合(100未満など)のみです。商用ソフトウェアを作成する場合、無限の反復回数を持つ再帰アルゴリズムを使用することはまったく専門的ではなく、非常に怒っている顧客を与える可能性があります。

3
Mick