Java 我应该如何修改我的基本情况以避免递归代码中的堆栈溢出?

Java 我应该如何修改我的基本情况以避免递归代码中的堆栈溢出?,java,recursion,methods,stack-overflow,Java,Recursion,Methods,Stack Overflow,基本上,我的代码需要计算一个nxn矩阵中路径的和(从0,0开始),并在只允许向右或向下移动的地方加上最小的和 例如,下面的矩阵应该输出18,因为最小路径是51246,但我不知道我的基本情况应该如何。我知道一旦我到达数组[n][n]就应该停止递归。在下面的代码中,我得到了一个stackoverflow错误 import java.util.*; 公共类最短路径{ 公共静态int findminpath(int[]c,int x,int y,int n){ 如果(x==n-1&&y==n-1){ 返

基本上,我的代码需要计算一个nxn矩阵中路径的和(从0,0开始),并在只允许向右或向下移动的地方加上最小的和

例如,下面的矩阵应该输出18,因为最小路径是51246,但我不知道我的基本情况应该如何。我知道一旦我到达数组[n][n]就应该停止递归。在下面的代码中,我得到了一个stackoverflow错误

import java.util.*;
公共类最短路径{
公共静态int findminpath(int[]c,int x,int y,int n){
如果(x==n-1&&y==n-1){
返回c[x][y];
}否则{
int path1=findminpath(c,x+1,y,n);
int path2=findminpath(c,x,y+1,n);
返回c[x][y]+数学最小值(路径1,路径2);
}
}
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int[][]数组=新的int[3][3];

对于(inti=0;i,问题来自您的if语句

if (x==n-1 && y==n-1)
请注意,如果手动跟踪代码,堆栈上将有以下方法调用

findminpath(array, 0, 0, 3)
findminpath(array, 1, 0, 3)
findminpath(array, 2, 0, 3)
findminpath(array, 3, 0, 3)
findminpath(array, 4, 0, 3)
findminpath(array, 5, 0, 3)
findminpath(array, 6, 0, 3)
findminpath(array, 7, 0, 3)
....

原因在于if语句中的
&&
。y还没有增加,并且它永远不会从这个递归中增加,因为直到x达到最大int值。

缩进似乎是一个肤浅的问题,但它通常是理解某人代码的关键。这完全是不可控的ol在这里,根本没有组织。如果你能清理一下,你可能会更进一步了解问题所在。@tadman现在更好了吗?看起来可读性更强。干得好。*直到它达到max int…呃,足够公平。你赢了。@SaxyPandaBear你能给我一个基本情况的提示吗?因为我试过使用| |而不是&&but那么这将不会达到最大int,我尝试使用c[x][y]==c[n-1][n-1]但它仍然不起作用。你似乎真的必须去重新思考你的方法。想想你需要记住什么。你的递归的边界是什么?你知道如果x等于n×n矩阵的长度,你就不能继续增加x,如果y等于n×n矩阵的长度,你就不能继续增加x为什么你要把它全部放在一个案例中?增加x和增加y不是一条不同的路径吗?它们终止的要求不一样吗?
if (x==n-1 && y==n-1)
findminpath(array, 0, 0, 3)
findminpath(array, 1, 0, 3)
findminpath(array, 2, 0, 3)
findminpath(array, 3, 0, 3)
findminpath(array, 4, 0, 3)
findminpath(array, 5, 0, 3)
findminpath(array, 6, 0, 3)
findminpath(array, 7, 0, 3)
....