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;
}
注:上記のサンプルコードは、複数の再帰が使用されていることを言及するために使用したため、無限ループである可能性があります。実際の実装は無限ループではありません。
この場合、基本条件は、ノードがすでに処理されている場合、再帰を使用せず、結果を直接返すことです。
私の質問は、複数の再帰が使用されている場合、どのように反復に置き換えることができるかです。私はグーグルで検索し、再帰を反復またはストックに置き換えるための多くの提案を見つけました. しかし、複数の再帰を反復に置き換えることについては何も見つかりません。