请解释为什么我的代码导致堆栈溢出错误

问题描述 投票:0回答:1

这里是代码:

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语句没有问题,我完全不知道它们有什么不同。

java recursion stack-overflow
1个回答
-1
投票

这是因为当您的代码从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)

© www.soinside.com 2019 - 2024. All rights reserved.