私はあなたがすべての良い日を過ごしている願っています。
先生は私のオフパンツを混同しています。私は私の本を読んで研究し、私はまだ混乱していました。私はちょうど今の方法を学んでいるので、私は長い道のりを持っています。私はそれは、ユーザが再びプレーしたい場合は依頼する方法「ゲームオーバー」を使用し、ゲームのように「オレゴン・トレイル」を作りました。
主な問題は:私の先生は、ゲームが十分な回数ループした場合、我々はstackoverflowので終わるだろうについて漠然と何かを述べました。ゲームがスタックに「新しいゲーム」メソッドが呼び出されるたびに加算し、私はそれを持って道互いの内部にネスト方法に続けているため、外の方法はまだ完了してそこに待っているので、それは、私には意味があります。
私は私が何を意味するかの例を煮詰めてきました。ユーザの入力と、そのようなのための一時停止があったと仮定すると、どのように私は他の方法内部のメソッドを呼び出すと、私のメモリ使用率が成長を維持しないことを確認することが出来るのですか?私はこのための言葉は、このように、私のタイトル「再帰的」だと思います。
誰もがこれに対処するための良いフォームをお勧めすることができれば、私は本当に感謝されると思います。
public class Testing
{
public static void main(String[] args) {
System.out.println("main method");
gameStart();
}
private static void gameStart()
{
System.out.println("some other method called");
gameOver();
}
private static void gameOver()
{
System.out.println("game over called"); //I would ask the user if they want to play again.
//keeping it concise to illustrate my point, instead of using an if statement
gameStart();//starting the cycle I'm concerned about. Assume the user indicated they would like to play again.
}
}
無限の再帰を避けるために、あなたは、反復に切り替えると、現在(現在は直接対応するアクションを呼び出すことで)続行する方法を決定するこれらのメソッドの戻り値を導入することができます。これらのメソッドは、列挙型を使用することにより、例えば、次に何をすべきか、いくつかの記号を返しましょう。その後、戻り値に応じて、右のメソッドを呼び出すループを記述。
例(略し、私はあなたがJava構文を知っていると仮定します):
enum Action { Start, ShowEnd, Quit }
メイン:
Action nextAction = Action.Start;
while (action != Action.Quit)
{
switch (action)
{
case Start:
nextAction = gameStart();
break;
case ShowEnd:
nextAction = gameEnd();
break;
// ToDo: write more actions!
default:
break;
}
}
これは、意思決定は、次の取るためにどのアクションについて行われるまで、それぞれのそのような方法が実行されることを前提としています。
実行は、常に他の方法にオフmainメソッドに戻り、その後、枝のように、この方法は、あなたのコールスタックは常に、非常にフラットになります。