public class Main {
private static int sumRec(int n) {return n>0 ? n + sumRec(n-1) : 0;}
private static class Eval {
public void sum() {
if (param>0) {
Eval e = new Eval (param-1);
e.sum();
rezult = param + e.rezult;
}
else rezult = 0;
}
private int param;
public int rezult;
Eval (int n) { param = n; }
}
public static void main(String[] args) {
int n = 10000;
//System.out.println("recursive : " + sumRec(n));
Eval e = new Eval (n);
e.sum();
System.out.println("trampoline: " + e.rezult);
}
}
Очевидные замечания, что можно посчитать в цикле или даже вспомнить Карла Фридриховича и посчитать в пару операций прошу не приводить - это все понятно, пример просто ради того, чтобы попробовать технологию, которая потом будет использоваться на нормальных задачах (если будет работать). Выдает переполнение стека. Собственно, почему? Объект через new каждый раз создается в куче, рекурсивных вызовов нет. На что расходуется стек текущего потока?
ЗЫ читал, что можно этот вычислительный объект создавать каждый раз в новом потоке, но мне хотелось бы остаться в одном. К тому же, я не знаю, как Java переварит миллион потоков, к примеру.