Как преобразовать рекурсию в итерацию с помощью LoadingCache?

Я полностью переписал этот вопрос, так как первоначальный был неразрешим. Для простоты я использую числа Фибоначчи в качестве игрушечного примера.

Тривиальное рекурсивное кэшированное вычислениезаканчивается очень длинной трассировкой стека, как и ожидалось. Вот почему я хотел бы иметь абстрактный класс, например IterativeLoadingCache, который я мог бы расширить как здесьчем-то вроде

@Override
protected Integer computeNonRecursivelly(Integer key) {
    final Integer x1 = getOrEnqueue(key-1);
    final Integer x2 = getOrEnqueue(key-2);
    if (x1==null) return null;
    if (x2==null) return null;
    return x1+x2;
}

и который позаботится обо всем кэшировании и вычислениях без использования рекурсии.

Я действительноне ищу эффективного вычисления чисел Фибоначчи. Мне нужно что-то, позволяющее использовать кеширование вместе с рекурсивными функциями, где глубина рекурсии может быть произвольно большой.

У меня уже есть какое-то решение, но оно довольно неэффективно и очень уродливо, поэтому я надеюсь получить хороший совет. Мне также любопытно, нужно ли это кому-то еще или, может быть, уже реализовано.

6
задан maaartinus 18 August 2012 в 14:57
поделиться