【问题标题】:How should I amend my base case to avoid stack overflow in my recursive code?我应该如何修改我的基本情况以避免递归代码中的堆栈溢出?
【发布时间】:2017-07-04 20:58:52
【问题描述】:

基本上,我的代码需要计算 nxn 矩阵中路径的总和(从 0,0 开始),并将我只能向右或向下移动的最小总和相加。

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

512
234
566 
import java.util.*;

public class shortestpath {

    public static int findminpath(int [][]c,int x,int y,int n) {
        if (x==n-1 && y==n-1) {
            return c[x][y];
        } else {
            int path1 = findminpath(c,x+1,y,n);
            int path2 = findminpath (c,x,y+1,n);
            return c[x][y] + Math.min(path1,path2);
        }
    }

    public static void main (String [] args) {
        Scanner sc = new Scanner (System.in);
        int[][] array = new int[3][3];
        for (int i=0; i<array.length; i++){
            for (int j=0; j<array.length; j++){
                array[i][j] = sc.nextInt();
            }
        }
        System.out.println(findminpath(array,0,0,array.length));
    }
}

【问题讨论】:

  • 缩进可能看起来像一个肤浅的问题,但它通常是理解某人代码的关键。这里完全失控,根本没有组织。如果你能解决这个问题,你可能离理解问题更近了一步。
  • @tadman 现在好点了吗?
  • 这看起来更具可读性。干得好。

标签: java recursion methods stack-overflow


【解决方案1】:

问题来自您的 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 语句中有&amp;&amp;。 y 还没有增加,它永远不会从这个递归中增加,因为你会一直到 x 达到最大 int 值。

【讨论】:

  • *直到达到最大 int ... ?
  • 嗯。很公平。你赢了。
  • @SaxyPandaBear 你能给我一个基本情况的提示吗?因为我尝试过使用 || insteaf of && 但这不会达到最大 int ,我尝试使用 c [x][y]==c[n-1][n-1] 但仍然无法正常工作
  • 看来你真的必须去重新考虑你的方法了。想想你需要记住什么。你的递归的界限是什么?您知道如果 x 等于 n x n 矩阵的长度,则不能继续增加 x,并且您知道如果 y 等于 n x n 矩阵的长度,则不能继续增加 y。你为什么把它全部放在一个箱子里?增加 x 与增加 y 不是不同的路径吗?他们没有不同的终止要求吗?
猜你喜欢
  • 2015-11-22
  • 2013-06-28
  • 2011-08-15
  • 2017-06-03
  • 1970-01-01
  • 2010-11-14
  • 2010-11-30
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多