gpt4 book ai didi

java - 为什么我的递归没有返回但最终导致堆栈溢出?

转载 作者:行者123 更新时间:2023-11-29 03:46:58 25 4
gpt4 key购买 nike

首先,这是加分作业的一部分,所以请不要给我答案。请帮助我了解我可能对正在发生的事情有疑问的地方。它是一个井字游戏生成器,游戏在其中递归地进行,以确定基于玩家的最佳着法。 (教授用白色'W'和黑色'B'代替X和O)

我的主要递归方法根据 TTT 板上的输入位置返回状态分数; 1 如果白方会从那个位置强制获胜,0 如果是平局,-1 如果黑色会从那个位置强制获胜:

public int stateScore(boolean whiteMove, int[] BestMove) {
return stateScore(whiteMove,BestMove,TTTBoard);
}

调用我的底层私有(private)递归方法:

private int stateScore(boolean whiteMove, int[] BestMove,char[][] TestBoard) {
char [][] newTestBoard = new char [3][3];
for(int rowVal = 0; rowVal < 3; rowVal++){
for(int colVal = 0; colVal < 3; colVal++){
newTestBoard[rowVal][colVal] = TestBoard[rowVal][colVal];
}
}

int [] bestMove = new int [2];

for(int rowVal = 0; rowVal < 3; rowVal++){
for(int colVal = 0; colVal < 3; colVal++){
if(isFull(newTestBoard) == true){
return 0;
}
else if(newTestBoard[rowVal][colVal] == '-'){
bestMove[0] = rowVal;
bestMove[1] = colVal;

//if boolean is white
if(whiteMove == true){
newTestBoard = testEntry(rowVal,colVal,'W',newTestBoard);
if(threeInRow(newTestBoard) == 1){
return 1;
}
else if(threeInRow(newTestBoard) == 0 && isFull(newTestBoard) == true){
return 0;
}
else if(threeInRow(newTestBoard) == -1 && isFull(newTestBoard) == true){
return -1;
}
else{
return stateScore(!whiteMove,bestMove,newTestBoard);
}
}
//if boolean is black
else{
newTestBoard = testEntry(rowVal,colVal,'B',newTestBoard);
if(threeInRow(newTestBoard) == -1){
return -1;
}
else if(threeInRow(newTestBoard) == 0 && isFull(newTestBoard) == true){
return 0;
}
else if(threeInRow(newTestBoard) == 1 && isFull(newTestBoard) == true){
return 1;
}
else{
return stateScore(!whiteMove,bestMove);
}
}
}
}
}
return 0;
}

whiteMove 的 boolean 值如果是白棋则为真,如果是黑棋则为假。函数中的辅助方法包括 threeInRow:

public int threeInRow(char[][] TTTBoard){
boolean whiteIs = false;
boolean blackIs = false;
//Horizontal?
char [] colChar = new char [3];
for(int rowVal = 0; rowVal < 3; rowVal ++){
for(int colVal = 0; colVal < 3; colVal++){
colChar[colVal] = TTTBoard[rowVal][colVal];
}
if(colChar[0] == colChar[1] && colChar[1] == colChar[2]){
if(colChar[0] == 'W'){
whiteIs = true;
}
if(colChar[0] == 'B'){
blackIs = true;
}
}
}

//Vertical?
char [] rowChar = new char [3];
for(int colVal = 0; colVal < 3; colVal ++){
for(int rowVal = 0; rowVal < 3; rowVal++){
rowChar[colVal] = TTTBoard[rowVal][colVal];
}
if(rowChar[0] == rowChar[1] && rowChar[1] == rowChar[2]){
if(rowChar[0] == 'W'){
whiteIs = true;
}
else if(rowChar[0] == 'B'){
blackIs = true;
}
}
}

//Diagonal
//topLeft to bottomRight
if(TTTBoard[0][0] == TTTBoard[1][1] && TTTBoard[1][1] == TTTBoard[2][2]){
if(TTTBoard[0][0] == 'W'){
whiteIs = true;
}
else if(TTTBoard[0][0] == 'B'){
blackIs = true;
}
}

//topRight to bottomLeft
if(TTTBoard[0][2] == TTTBoard[1][1] && TTTBoard[1][1] == TTTBoard [2][0]){
if(TTTBoard[1][1] == 'W'){
whiteIs = true;
}
else if(TTTBoard[1][1] == 'B'){
blackIs = true;
}
}


//Return Vals
if(whiteIs == true && blackIs == true){
return 0;
}
else if(blackIs == true && whiteIs == false){
return -1;
}
else if(blackIs == false && whiteIs == true){
return 1;
}
else if(blackIs == false && whiteIs == false){
return 0;
}
else{
return 0;
}

}

和测试条目:

public char[][] testEntry(int row,int col,char newChar, char[][] TestBoard){

char [][] returnBoard = new char[3][3];
for(int rowVal = 0; rowVal < 3; rowVal++){
for(int colVal = 0; colVal < 3; colVal++){
returnBoard[rowVal][colVal] = TestBoard[rowVal][colVal];
}
}
returnBoard[row][col] = newChar;
return returnBoard;

}

我不明白堆栈溢出是从哪里来的。似乎我的返回涵盖所有情况,而且我的方法有适当的返回。我从来没有用过递归的 for 循环,我是不是把它搞砸了。另外,我说 type [] name = name (相同类型)不起作用,对吗?这就是我在那种情况下使用 for 循环的原因。

最佳答案

在你的黑色分支中,你的返回是错误的。

你回来了

return stateScore(!whiteMove,bestMove);

重新开始递归。你想回来

return stateScore(!whiteMove,bestMove,newTestBoard);

提示:

  • 修正你的 boolean 值:

    if(whiteMove == true) -> if (whiteMove)
  • 类使用大写,变量使用小驼峰。

  • 如果您在 if 分支中返回,则不需要 else。

    代替:

    if (condition) {
    ...
    return ...;
    }
    else
    {
    ...
    }

    最好这样写:

    if (condition) {
    ...
    return ...;
    }
    ...

    保持较低的嵌套并使代码更易于理解。

  • 重构公共(public)代码:两个分支返回相同的结果:

    return stateScore(!whiteMove,bestMove,newTestBoard);

    为什么不把它移到 if (whiteMove) 之外

关于java - 为什么我的递归没有返回但最终导致堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10456028/

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