【问题标题】:Recursive max stack overflow error递归最大堆栈溢出错误
【发布时间】:2015-06-17 04:38:10
【问题描述】:

我正在尝试为数据结构类的最大值和最小值编写一个 3 输入递归程序。我收到堆栈溢出错误。我不知道我是否要离开阵列的末端,但据我的理解,我不应该这样做。任何帮助,将不胜感激。这是我的代码:

class Extrema {

    // maxArray()
    // returns the largest value in int array A
    // p is position zero, r is position length-1
    static int maxArray(int[] A, int p, int r) {
        int q;
        if (p == r) {
            return A[p];
        } else {
            q = (p + r)/2;
            return max(maxArray(A, p, q-1), maxArray(A, q+1, r));
        }
    }

    // max()
    // returns the largest value of two ints
    private static int max(int a, int b) {
        return a > b ? a : b;
    }

    // main()
    public static void main(String[] args) {
        int[] B = {-1, 2, 6, 3, 9, 2, -3, -2, 11, 5, 7};
        System.out.println( "max = " + maxArray(B, 0, B.length-1) );  // output: max = 11
    } 
}

【问题讨论】:

  • 你是在使用二分查找的方法在一个unsorted数组中查找最大值???
  • 添加一些调试语句以在调用 maxArray 时测试值 p 和 r。 p 可以等于 r 吗?更一般地说,为什么不通过简单的循环遍历数组来找到最大值?

标签: java recursion stack stack-overflow


【解决方案1】:

要么做非递归,因为递归在这里真的没有任何意义:

static int maxArray(int[] A, int p, int r)  {
    int max = A[p];
    for (int i = p + 1; i <= r; i++) {
        if (A[i] > max)
            max = A[i];
    }
    return max;
}

或者,如果您坚持使用某种递归,只需稍作改动即可使用现有代码:

return max(maxArray(A, p, q), maxArray(A, q+1, r));

注意对第一个 maxArray 函数的调用现在通过 q 而不是 q-1 作为结束索引。

【讨论】:

    【解决方案2】:

    更改此代码

    if (p == r) {
        return A[p];
    }
    

    if (p >= r) {
        return A[p];
    }
    

    并注意当你调用语句时

    return max(maxArray(A, p, q-1), maxArray(A, q+1, r));
    

    你失去了 q 元素,所以调用

    return max(maxArray(A, p, q), maxArray(A, q+1, r));
    

    【讨论】:

    • 他不会再崩溃,但代码仍然会出错,找不到最大值。
    • 关于 2.:当然他的算法会起作用,只是没有意义,但那是不同的。
    猜你喜欢
    • 2018-03-10
    • 2014-08-27
    • 2016-11-11
    • 1970-01-01
    • 2012-08-20
    • 2016-12-30
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多