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