gpt4 book ai didi

Java:难以理解递归方法调用

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:00:51 26 4
gpt4 key购买 nike

我做了一个类似“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.
}
}

最佳答案

递归需要一个不会继续调用的条件。
递归最常见于方法调用自身的地方,例如计算斐波那契数列,其中

fib(n) == fib(n-1) + fib(n-2)

fib(0) 定义为 0,因此您无需计算。
fib(1) 定义为 1,因此您无需计算。
fib() 方法调用自身 两次 来计算其他每个数字,但它逃避了对两个定义的情况进行递归调用,其中没有什么可计算的。在伪代码中

int fib(int n)
{
if (n == 0) return 0; // doesnt have to recursively call
if (n == 1) return 1; // same
return fib(n-1) + fib(n-2);
}

在您的情况下,您有两个相互调用 的方法,但您没有条件让调用可以从中逃脱。

一种可能性是 gameOver() 仅在游戏以平局结束时调用 gameStart(),例如

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");
if (gameTied()) {
gameStart();
}
}
}

如果你只是问“你想再玩一次吗?” -- 最好在 main 中完成,按照

public static void main(String[] args) {
System.out.println("main method");
String playGame = "Yes";
while (playGame.equalsIgnoreCase("Yes") {
gameStart();
playGame = ask("Play again?");
}
}

关于Java:难以理解递归方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52864749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com