Рекурсивная ошибка переполнения максимального стека

1

Я пытаюсь написать 3-х входную рекурсивную программу для max и min для класса структур данных. Я получаю ошибку. Я не могу сказать, уйду ли я с конца массива, но я не должен быть так далеко, насколько я понимаю. Любая помощь будет оценена по достоинству. Вот мой код:

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
    } 
}
  • 1
    Вы используете метод двоичного поиска для поиска максимального значения в несортированном массиве ???
  • 0
    Добавьте несколько операторов отладки, чтобы проверить значения p и r при вызове maxArray. Может ли р когда-либо равняться г? И вообще, почему бы не просто цикл по массиву, чтобы найти максимальное значение?
Теги:
recursion
stack
stack-overflow

2 ответа

0

Изменить этот код

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));
  • 0
    он больше не потерпит крах, но код все равно будет неправильным и не найдет максимум.
  • 0
    по поводу 2 .: конечно его алгоритм будет работать, это просто не имеет смысла, но это что-то другое.
0

Либо это не рекурсивно, так как рекурсия действительно не имеет никакого смысла здесь:

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 качестве конечного индекса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню