RosettaCodeData/Task/Anonymous-recursion/Java/anonymous-recursion-2.java

26 lines
889 B
Java
Raw Normal View History

2013-04-10 14:58:50 -07:00
import java.util.function.Function;
@FunctionalInterface
interface SelfApplicable<OUTPUT> {
2017-09-23 10:01:46 +02:00
OUTPUT apply(SelfApplicable<OUTPUT> input);
2013-04-10 14:58:50 -07:00
}
class Utils {
2017-09-23 10:01:46 +02:00
public static <INPUT, OUTPUT> SelfApplicable<Function<Function<Function<INPUT, OUTPUT>, Function<INPUT, OUTPUT>>, Function<INPUT, OUTPUT>>> y() {
return y -> f -> x -> f.apply(y.apply(y).apply(f)).apply(x);
}
2013-04-10 14:58:50 -07:00
2017-09-23 10:01:46 +02:00
public static <INPUT, OUTPUT> Function<Function<Function<INPUT, OUTPUT>, Function<INPUT, OUTPUT>>, Function<INPUT, OUTPUT>> fix() {
return Utils.<INPUT, OUTPUT>y().apply(Utils.<INPUT, OUTPUT>y());
}
2013-04-10 14:58:50 -07:00
2017-09-23 10:01:46 +02:00
public static long fib(int m) {
if (m < 0)
throw new IllegalArgumentException("n can not be a negative number");
return Utils.<Integer, Long>fix().apply(
f -> n -> (n < 2) ? n : (f.apply(n - 1) + f.apply(n - 2))
).apply(m);
}
2013-04-10 14:58:50 -07:00
}