Java не поддерживает хвостовые вызовы.
Обычный обходной путь – это тип, подобный следующему.
class Thunk { boolean isDone(); Thunk step(); A finish(); }
С математической точки зрения этот тип на самом деле является корекурсивным определением, похожим на тип данных потока.
exists b. (b -> (b + a))
Случается, что существует двойной рекурсивный тип данных.
forall b. ((a -> b) -> (b -> b) -> b
Вы можете применить математику к простой факториальной функции следующим образом.
C fact (int m, int n, Function ,C> y, Function result) { if (n < 1){ return h.apply(m); } return y.apply(() -> fact(m *n, n -1, y, h)); }
На первый взгляд кажется, что мы ничего не получили от этого подхода, кроме некоторой косвенности. Но на самом деле это позволяет нам отложить и продумать шаг оценки или просто оценить его напрямую.
Я все еще не уверен, что это лучший подход для хвостовых вызовов в JVM, но я по-прежнему надеюсь, что схемы рекурсии дадут лучший ответ, чем обычный.
Оригинал: “https://dev.to/mspondee/recursion-corecursion-and-thunks-2ok9”