StackOverflowError при Рекурсии для вычисления цифрового корня

вот такой вариант кода работает при вычислении цифрового корня:

public static int digital_root(int n) {
        while(n>9)
    n=n-9;
    return n;
  }

хотел его усовершенствовать при помощи рекурсии:

return n <= 9 ? n : digital_root(n-9);

вычисляет все верно до int 209502 примерно, а затем уходит в переполнение стека. Хотя циклы сами по себе, на мой неискушенный взгляд, подобные. При этом другие методы рекурсии выполняются нормально на больших int, например этот:

return n <=9  ? n : digital_root(n % 10 + digital_root(n / 10));

это специфика компилятора при обработке таких рекурсий или у меня ошибка?


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

Автор решения: Denis Rozhko

Смотри ты должен понимать что такое стек в памяти джава, это стек ячеек с памятью выделенное под вызов метода, то есть если в рекурсии ты вызываешь метод 1000, то и глубина стека будет 1000 ( а вот когда метод заканчивается, он выбрасывается из стека), не важно какой инт, главное какой лимита стека у тебя, ты можешь увеличить его -Xss{память}m, но это неправильно. Рекурсия нужна когда без нее нельзя обойтись, допустим обход дерева в глубину, сама по себе рекурсия нерациональна

→ Ссылка