Нужно избавиться от Stackoverflow

Код:

public static boolean maMaleRozdiely(int[] p, int odIdx, int poIdx, int rozdiel) {
        if ((poIdx-odIdx) == 0) return true;
        if (Math.abs(p[odIdx + 1] - p[odIdx]) > rozdiel)
            return false;
        
        return maMaleRozdiely(p, odIdx+1, poIdx, rozdiel);
    }

нужно сделать так что при входном массиве 10000000 не выписывало ошибку


Ответы (1 шт):

Автор решения: Alexandr

Крайне рекомендую Вам переписать код без рекурсии. Вы можете увеличичить размер стека указав параметр Xss. Предполагаю на разных версиях максимальный размер стека может быть разный, но на сколько помню вроде он равен 1g.

Накидал небольшой пример для замера максимальной глубины рекурсии:

package com.somepackage;

public class Main {
    private static int recurse(int i) {
        try {
            return recurse(i + 1);
        } catch (Throwable e) {
            return i;
        }
    }

    public static void main(String[] args) {
        int i = recurse(0);
        System.out.print(
                "Recursion depth is " + i + ".");
    }
}

Без указанного значения размера стека получаем следующие значения:

Recursion depth is 20155.

При запуске с заданным значением размера стека 1g:

Recursion depth is 44707800.

Пример запуска:

java -Xss1g com.somepackage.Main
→ Ссылка