2010-12-22 7 views
33

再帰的に何かを呼び出すことができるコントロールはありますか?基本的なテストプログラムからC#再帰の深さ - どのように深くすることができます

私はスタックサイズに依存してわずか18K

の再帰の深さを得る....

すると、メモリのチャンク(おそらくスレッドを設定する方法があります)大きなスタックを使用して再帰の深さを増やす?

+0

[管理された実行可能ファイルのデフォルトスタックサイズを変更する方法](http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed -executable-net) –

+1

無限に深い。少なくとも、テールコールをサポートする言語で。 – Juliet

+6

<はじめに参照> 3レベル深い...

答えて

40

ドキュメントの認識中にスタックサイズが大きくなりました。それは本当に必要でした。

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

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

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

Source

あなたが必要なこの何を願っています。

+9

私はこれが誰にも必要なものだと本当に疑っています。このようなコードを作成するべきではありません。私は試みたプログラマーを袋に入れます。任意の再帰アルゴリズムは、再帰を使用せずに実装することができ、場合によっては、問題の順序を大きさで減らす方法で実装できます。これは、エンジンを固定するためにスレッジハンマーを使用する自動車整備士のようなものです。 – Mick

+0

@Mick、再帰を使用するコードがあなたのコントロールの外にある場合はどうなりますか?たとえば、再帰を使用するサードパーティのライブラリを使用している可能性があります。 – Sam

+8

私は第三者を見つけるだろう;) – Mick

5

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

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

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

16

ここで問題が発生する危険があると思います。再帰的アルゴリズムがどのくらいのスタックを使用するかを正確に判断するのは難しいです。十分なものがあるかどうかという疑問がある場合は、別のアプローチを探してみましょう。

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

+16

+1すべての再帰アルゴリズムは、ループとスタックのデータ構造で非再帰的に書くことができます。 –

+6

@Byron:私のデータ構造クラスを大学で覚えてくれてありがとう。教授:「このツリートラバーサルプログラムを非再帰形式で書く」私:「なぜあなたは私たちを憎んでいるのですか?」 :) –

+4

私の質問はそれをやる方法でした、私は実際にそれをしたいと思っているよりもより興味があった。これは良いアドバイスですが、疑問に答えることはできません。 –

2

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

コールの深さが定義され、低い(100未満)場合にのみ、再帰を使用することがあります。商用ソフトウェアを作成する場合、反復回数が不定な再帰アルゴリズムを使用することは完全に専門家でなく、非常に怒っている顧客になる可能性があります。