gpt4 book ai didi

java - 数组语句中的方法调用导致程序到 "hang"

转载 作者:行者123 更新时间:2023-11-30 07:21:29 24 4
gpt4 key购买 nike

我编写了一个基于尝试解决骑士之旅问题的程序。我相信我已经想出了一个合适的解决方案,一切看起来都很好。

我很好奇的一个小问题是一小段代码实现了基于展望 future 可能的方 block 的最佳着法。

如果我这样实现它 (implementation1)–

if( moveMade )  // if any move is possible
{
currentRow += vertical[ betterMove( valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn ) ];
currentColumn += horizontal[ betterMove( valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn ) ];
board[ currentRow ][ currentColumn ] = squareCounter;
squareCounter++;
moveMade = false;
}
else
moveMade = true; // if there are no moves possible this is the end

软件会挂起——为什么?

如果我做一个小的无害的、看似微不足道的改变,比如这个(实现2)——

int temp1 = betterMove( valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn );

if( moveMade ) // if any move is possible
{
currentRow += vertical[ temp1 ];
currentColumn += horizontal[ temp1 ];
board[ currentRow ][ currentColumn ] = squareCounter;
squareCounter++;
moveMade = false;
}
else
moveMade = true; // if there are no moves possible this is the end

然后一切正常,代码将得出结论。

我正在使用 netbeans 7.1 编写我的软件,并认为它一定与 IDE 有关,所以我尝试仅使用“javac”和命令行编译它,但结果相同。我不明白为什么我不能像这样在数组参数内调用这个方法——vertical[HERE] 或 horizo​​ntal[HERE] 并在表达式中使用返回的结果。我以前成功地编写过这样的代码,没有任何问题。

这是被调用的方法——

public static int betterMove( int moverMatrix[], int theHorizontal[], int theVertical[], int accessBoard[][], int newCurrentRow, int newCurrentColumn )
{
int[] equalMatrix = new int [ 8 ]; // records the positions which are equal in value with a (1)
int[] bmValueMatrix = new int[ 8 ]; // holds the numbers taken from accessibility heuristic
int[] finalTable = new int[ 8 ]; // the best move discovered
int best = bestMove( moverMatrix ); // the lowest number in the given array
int startPos = best + 1;
int moveNumber = 0;
int originalCurrentRow = newCurrentRow;
int originalCurrentColumn = newCurrentColumn;

equalMatrix[ best ] = 1; // mark the lowest value position with a 1

initVMatrix( bmValueMatrix );
initVMatrix( finalTable );

for( int i = startPos; i < 8; i++ ) // mark the elements of equal value in equalMatrix with (1)
{
if( moverMatrix[ best ] == moverMatrix[ i ] )
equalMatrix[ i ] = 1;
}

for( int j = 0; j < 8; j++ ) // go through each element of equalMatrix and look forward
{ // for best accessibility heuristic
newCurrentRow = originalCurrentRow;
newCurrentColumn = originalCurrentColumn;
if( equalMatrix[ j ] == 1 )
{
newCurrentRow += theVertical[ j ];
newCurrentColumn += theHorizontal[ j ];
while( moveNumber < 8 )
{
if( newCurrentRow + theVertical[ moveNumber ] >= 0 &&
newCurrentRow + theVertical[ moveNumber ] < 8 )
{
if( newCurrentColumn + theHorizontal[ moveNumber ] >= 0 &&
newCurrentColumn + theHorizontal[ moveNumber ] < 8 )
{
bmValueMatrix[ moveNumber ] = accessBoard[ newCurrentRow + theVertical[ moveNumber ] ]
[ newCurrentColumn + theHorizontal[ moveNumber ] ];
} // end if
} // end if
moveNumber++;
} // end while
moveNumber = 0;
finalTable[ j ] = bestMove( bmValueMatrix );
initVMatrix( bmValueMatrix );
} // end if

} // end for
return bestMove( finalTable );
}

上面return语句中使用的方法bestmove——

public static int bestMove( int theMoves[] )
{
int theLowest = 10,
idealMove = 0;

for( int i = 0; i < 8; i++ )
{
if( theMoves[ i ] < theLowest )
{
theLowest = theMoves[i];
idealMove = i;
}
}
return idealMove;
}

最佳答案

currentRow += vertical[ betterMove( valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn ) ];
currentColumn += horizontal[ betterMove( valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn ) ];

在上述情况下,两个数组的索引值不相同。

问题是,当您第二次调用 betterMove 方法时,currentRow 值已经改变,因为您正在传递 currentRow 在您的方法中作为参数之一,因此,用于 horizo​​ntal 数组的 index 与调用if (moveMade) 之外的方法。

请注意,区别仅在于第二条语句。第一个将与两种方式相同。

所以,这可能是个问题。

因此,您需要先存储该方法执行的返回值,然后将该返回值作为verticalhorizo​​ntal 数组的索引。

int temp1 = betterMove( valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn );

if( moveMade ) // if any move is possible
{
currentRow += vertical[ temp1 ];
currentColumn += horizontal[ temp1 ];
// Rest of the code
}

现在在这种情况下,两个数组都具有相同的索引值 - temp1

此外,如果您多次使用方法调用的返回值,并且该方法正在修改您的任何传递的参数,您应该始终调用该方法一次,并存储返回值,而是使用它。这将使您免于目睹奇怪的结果。

关于java - 数组语句中的方法调用导致程序到 "hang",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13363084/

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