gpt4 book ai didi

java - 如何摆脱递归方法调用的先前迭代?

转载 作者:行者123 更新时间:2023-12-02 12:37:08 24 4
gpt4 key购买 nike

我有一个方法可以检查用户输入的值是否在数组范围内:

public static void placeMove(int num1, int num2){
//checking if x and y are greater than rows and columns of a 2D array
if(num1 > rows-1 || num2 > columns-1){
System.out.println("This space is off the board, try again.");
int[] values = new int[2];
values = inputMove(); //calls inputMove method to ask user for new input
placeMove(values[0],values[1]); //calling itself to check
//if new values are prohibited
}
//code to place a value in grid[num1][num2]
}

我有一个二维数组(行和列的大小根据设置而变化):

char[][] grid = new char[rows][columns];

当我错误检查 num1/num2 是否大于其各自的行/列时,我的 placeMove 方法给出了 ArrayIndexOutOfBoundsException。 placeMove 再次调用 placeMove,第一次调用 placeMove 的状态保存在堆栈中,一旦第二次调用 placeMove 的执行完成,则第一次迭代将使用堆栈中保存的局部变量值恢复其进一步执行,并且导致异常。我该如何防止这种情况?感谢您的帮助!

最佳答案

非常简单:只需 return从递归调用后的函数中 - 或将其他代码放入 else block 中:

    placeMove(values[0],values[1]);
return; // <--
}
//code to place a value in grid[num1][num2]

或者:

    placeMove(values[0],values[1]);
}
else
{
//code to place a value in grid[num1][num2]
}

但实际上,不需要递归调用,您可以使用循环来代替:

while(num1 >= rows || num2 >= columns)
// ^ instead of if ^ (additionally changed comparison)
{
System.out.println("This space is off the board, try again.");
int[] values = inputMove();
// ^ can assign directly,
// (the array you created previously is just GC'ed)
num1 = values[0];
num2 = values[1];
}
//code to place a value in grid[num1][num2]

编辑以回复您的评论:

I have a call to inputMove() then placeMove(int num1, int num2) and finally a checkWin(int num1, int num2) method respectively in my main method. The checkWin() method uses the values returned from inputMove() method.

那么您不应该调用 inputMove placeMove ,而是:

int main(String[] args)
{
int[] values = inputMove();
while(values[0] >= rows || values[1] >= columns)
// by the way: you do not check for NEGATIVE input!!!
{
System.out.println("This space is off the board, try again.");
values = inputMove();
}
placeMove(values[0], values[1]); // <- won't read input any more!
checkWin(values[0], values[1]);
}

实际上,这应该是一个新问题,下次更愿意这样做,最好引用当前问题......

Edit2:实际上,正常检查输入是获取输入的一部分,因此我的建议是将 while 循环移至 inputMove :

int[] inputMove()
{
int[] values = new int[2];
for(;;)
{
// read only ROW as before
if(0 <= values[0] && values[0] < rows)
break;
System.out.println("row out of range");
}
// now the same for COLUMN
return values;
}

Main 现在只删除 while 循环:

int main(String[] args)
{
int[] values = inputMove();
placeMove(values[0], values[1]); // <- won't read input any more!
checkWin(values[0], values[1]);
}

这样,您就可以清楚地将彼此最密切相关的内容分组在一起。此外,通过行和列的两个单独循环,如果列无效,您不会强制用户重新输入行...

关于java - 如何摆脱递归方法调用的先前迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45096191/

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