import java.util.function.Function; public class YCombinator { interface RecursiveFunc extends Function, F> { } public static Function fix(Function, Function> f) { RecursiveFunc> r = w -> f.apply(x -> w.apply(w).apply(x)); return r.apply(r); } public static void main(String[] args) { Function fib = fix(f -> n -> { if (n <= 2) return 1; return f.apply(n - 1) + f.apply(n - 2); }); Function fac = fix(f -> n -> { if (n <= 1) return 1; return n * f.apply(n - 1); }); System.out.println("fib(10) = " + fib.apply(10)); System.out.println("fac(10) = " + fac.apply(10)); } }