который в основном состоит из преобразования хвостовой рекурсии в итерацию, то есть в общий цикл

бовал следующий пример, представленный вговорить понять хвостовую рекурсию в java8.

@FunctionalInterface
public interface TailCall<T> {
    TailCall<T> apply();

    default boolean isComplete() {
        return false;
    }

    default T result() {
        throw new Error("not implemented");
    }

    default T get() {
        return Stream.iterate(this, TailCall::apply).filter(TailCall::isComplete)
                                                .findFirst().get().result();
    }
}

Класс утилит для использования TailCall

public class TailCalls {
    public static <T> TailCall<T> call(final TailCall<T> nextcall) {
        return nextcall;
    }

    public static <T> TailCall<T> done(final T value) {
        return new TailCall<T>() {
            @Override
            public boolean isComplete() {
                return true;
            }

            @Override
            public T result() {
                return value;
            }

            @Override
            public TailCall<T> apply() {
                throw new Error("not implemented.");
            }
        };
    }
}

Вот использование рекурсии Tail:

public class Main {

    public static TailCall<Integer> factorial(int fact, int n) {
        if (n == 1) {
            return TailCalls.done(fact);
        } else {
            return TailCalls.call(factorial(fact * n, n-1));
        }
    }

    public static void main(String[] args) {
        System.out.println(factorial(1, 5).get());
        }
}

Он работал правильно, но я чувствую, что мы не требуемTailCall::get вычислить результат. Насколько я понимаю, мы можем напрямую рассчитать результат, используя:

System.out.println(factorial(1, 5).result());

вместо:

System.out.println(factorial(1, 5).get());

Пожалуйста, дайте мне знать, если я пропустил сутьTailCall::get.

Ответы на вопрос(1)

Ваш ответ на вопрос