-4

私はこのような簡単な方法を持っています:

public int method(int a) 
{    
    if(// something)
    {
        methode(a); 
    }
    else return 0;
}

呼び出しの深さが増すと、Visual Studio はstackoverflow 例外をスローします。

どうすればこの問題を解決できますか? リターン アドレスとローカル データを手動で保存し、カスタマイズされたスタックを実装する方法はありますか??

メソッドを非再帰型に変更したくないことに注意してください。

4

5 に答える 5

3

はい、C# (およびおそらく Java など) にはStack< T> クラスがあります。メソッドの場合、単純に Stack を作成し、そこに引数を格納できます。スタックが空になるまで繰り返します。

これにより反復ループが導入されますが、アルゴリズムは依然として再帰的です。(つまり、幅優先ではなく深さ優先)

もちろん、アルゴリズムが最終的に終了することを確認する必要があります。これは、オペレーティング システムが提供する以上のスタック スペースを増やす方法にすぎません。Windows は、ほとんどのアプリケーションに十分な量のスタック スペースをプロセスごとに割り当てます。さらに必要な場合は、独自のスタックのようなデータ構造をヒープに実装できます。通常、ヒープは、使用可能な RAM とアプリケーションの「ビット数」によって制限されます。

于 2013-10-07T07:23:26.623 に答える
1

どうすればこの問題を解決できますか? リターン アドレスとローカル データを手動で保存し、カスタマイズされたスタックを実装する方法はありますか??

再帰メソッドには、結果が返される終了ポイントが必要です。

于 2013-10-07T07:25:25.777 に答える
0

再帰の深さを減らす必要があります。

于 2013-10-07T07:24:07.600 に答える
0
public int method(int a ){
//do stuff
  var something = ... //you have to make sure something turns false at some point
  if(something){ 
    method(a);
  }  
}
于 2013-10-07T07:31:15.173 に答える
0

Dunken が言うように、「ある時点で何かが false になることを確認する必要があります」。

#define MAX 1000

#include <iostream>
using namespace std;



int methode(int a ){

    if(a>0 && a<MAX) return methode(a);

    return 0 ;

}// end

int main(void){


  methode(1);


  cout<<" \nPress any key to continue\n";
  cin.ignore();
  cin.get();

   return 0;
}
于 2013-10-07T07:40:29.013 に答える