【发布时间】:2018-10-17 23:01:12
【问题描述】:
我制作了一个类似“Oregon Trail”的游戏,它使用“游戏结束”的方法来询问用户是否想再玩一次。
主要问题: 我的老师提到了一些模糊的东西,如果游戏循环足够多次,我们最终会得到一个 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.
}
}
【问题讨论】:
-
你必须在赋值中使用递归还是允许使用循环?因为在我看来,使用循环是处理这种情况最简单、最“自然”的方式。
-
我会用循环解决这个特殊问题,而不用担心递归。现在,我们是否使用 LISP...
-
您可以使用 try-catch 和
StackOverflowError,然后在 catch 块中处理溢出。但是,捕获错误是不好的做法,所以我不建议这样做。 -
我必须使用递归。我制作的程序中有一堆循环,但我们应该这样做,而不是把整个游戏放在一个while或for循环中。
-
对了,谢谢大家帮助我。我只是想弄清楚如何在不重载堆栈的情况下继续调用相互调用的方法。比如,当我以某种方式调用新方法时,我可以清除堆栈,保留全局变量吗?