这里是代码:
public static int maxPathLengthHelper(int[][] paths, int x, int y){
int maxLength = 0;
if(x > 0 && paths[x-1][y] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x-1,y);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
if(y > 0 && paths[x][y-1] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x,y-1);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
if(x < paths.length - 1 && paths[x+1][y] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x+1,y);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
if(y < paths[0].length - 1 && paths[x][y+1] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x,y+1);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
return maxLength;
}
在更改y值的if语句中,引起堆栈溢出错误,但是在更改x值的部分中没有错误。我想知道为什么会这样。如果两者都错了,我将改变整个事情,但是仅在第二和第四次if语句中表明Stack Overflow错误是由递归调用引起的。第一个和第三个if语句没有问题,我完全不知道它们有什么不同。
这是因为当您的代码从0,0
移至1,0
时,它在满足第一个0,0
条件时再次检查if
public static int maxPathLengthHelper(int[][] paths, int x, int y, int previousX,int previousY){
int maxLength = 0;
if(x > 0 && previousX != x-1 && paths[x-1][y] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x-1,y,x,y);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
if(y > 0 && previousY != y-1 && paths[x][y-1] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x,y-1,x,y);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
if(x < paths.length - 1 && previousX != x+1 && paths[x+1][y] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x+1,y,x,y);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
if(y < paths[0].length - 1 && previousY != y-1 && paths[x][y+1] == 1){
int currentLength = 1 + maxPathLengthHelper(paths,x,y+1,x,y);
if(currentLength > maxLength){
maxLength = currentLength;
}
}
return maxLength;
}
并使用maxPathLengthHelper(originalPath,startX,startY,startX,startY)
进行调用
而不是maxPathLengthHelper(originalPath,startX,startY)