26 lines
741 B
Java
26 lines
741 B
Java
import java.util.function.Function;
|
|
|
|
public interface YCombinator {
|
|
interface RecursiveFunction<F> extends Function<RecursiveFunction<F>, F> { }
|
|
public static <A,B> Function<A,B> Y(Function<Function<A,B>, Function<A,B>> f) {
|
|
RecursiveFunction<Function<A,B>> r = w -> f.apply(x -> w.apply(w).apply(x));
|
|
return r.apply(r);
|
|
}
|
|
|
|
public static void main(String... arguments) {
|
|
Function<Integer,Integer> fib = Y(f -> n ->
|
|
(n <= 2)
|
|
? 1
|
|
: (f.apply(n - 1) + f.apply(n - 2))
|
|
);
|
|
Function<Integer,Integer> fac = Y(f -> n ->
|
|
(n <= 1)
|
|
? 1
|
|
: (n * f.apply(n - 1))
|
|
);
|
|
|
|
System.out.println("fib(10) = " + fib.apply(10));
|
|
System.out.println("fac(10) = " + fac.apply(10));
|
|
}
|
|
}
|