0

C# asp.net プログラムで再帰関数を使用していますが、「StackOverflow Exception」がスローされます。IIS でプログラムを実行すると、この例外がスローされます。

再帰関数の代わりにループを使用すると、「StackOverflow Exception」がスローされますか?

この例外の場合、ループと再帰のどちらを使用するのが良いですか?

編集:

問題を分析した結果、再帰のレベルが 1000 を超え、スタックがオーバーフローするために例外が発生することがわかりました。

複数の再帰が使用されているため、再帰関数を反復に変換する際に完全に失われました。参照用にここにサンプルコードを投稿しています。

RecursiveFunction(Node n)    {
   //Some Code for local variables
node.processed=true;
if(n.up){
   //Create a sub node for node below the current one
  if(!subnode.processed)
   RecursiveFunction(subnode);
}
else{
   //Create a sub node for node above current one
 if(!subnode.processed)
   RecursiveFunction(subnode);
}
return result;
}

注:上記のサンプルコードは、複数の再帰が使用されていることを言及するために使用したため、無限ループである可能性があります。実際の実装は無限ループではありません。

この場合、基本条件は、ノードがすでに処理されている場合、再帰を使用せず、結果を直接返すことです。

私の質問は、複数の再帰が使用されている場合、どのように反復に置き換えることができるかです。私はグーグルで検索し、再帰を反復またはストックに置き換えるための多くの提案を見つけました. しかし、複数の再帰を反復に置き換えることについては何も見つかりません。

4

2 に答える 2

1

わかりましたので、それが解決するかどうかを知りたいだけです:

はい、StackOverflowExceptionループに切り替えると取得できません。

メソッドを呼び出すと、呼び出しスタックにプッシュされます。それ自体から同じメソッドを呼び出すと、ますます大きなスタックが構築されます。最終的StackOverflowExceptionに、プログラムがスタックで使用可能なすべてのメモリを使い果たすと、これがポップする可能性があります。

ループでは、スタックにますますプッシュしないため、この問題は発生しません。ただし、実装が簡単ではない可能性があります。そうでない場合は、再帰を使用することはありません。

他の誰かが述べたように、この場合、再帰を使用しても問題はない可能性があります。それは、いつでも再帰を停止していないだけです。その場合、同じループ バージョンが永久に実行されます (ただし、StackOverflow は取得されません)。

于 2013-10-22T12:42:41.043 に答える