私は最近、このコードをJavaで見つけました。これは機能とフィボナッチ数の印刷を含み、機能します。Javaの再帰ラムダコールのこの部分はどのように動作しますか
public class AppLambdaSubstitution {
public static Function<Integer, Integer> Y(Function<Function<Integer, Integer>, Function<Integer, Integer>> f) {
return x -> f.apply(Y(f)).apply(x);
}
public static void main(String[] args) {
Function<Integer, Integer> fib = Y(
func -> x -> {
if (x < 2)
return x;
else
return func.apply(x - 1) + func.apply(x - 2);
});
IntStream.range(1,11).
mapToObj(Integer::valueOf).
map(fib).forEach(System.out::println);
}
}
私が混乱している部分はreturn x -> f.apply(Y(f)).apply(x);
です。 Y(f)
はメソッドY
への再帰呼び出しではありませんか?関数f
をパラメータとして呼び出しています。私には、この再帰的呼び出しが元に戻ってくるための基本的なケースはありません。無限の再帰呼び出しの結果、オーバーフローが発生しないのはなぜですか?
'Y(f)を'コールはラムダの内側にあります'f'がそれを呼び出すことを選択した場合にのみ、ラムダは実行されます。 – 4castle
https://en.wikipedia.org/wiki/Fixed-point_combinator – pvg