최근 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)'호출 람다 내부 : 당신이 더 가까이 보면
, 당신은 완전히 필요하지
Supplier
따라서 당신은 더욱 그것을 단순화 할 수 있음을 알 수 있습니다 , 그리고'f'가 그것을 호출하기를 원한다면 lambda는 단지 실행될 것입니다. – 4castlehttps://en.wikipedia.org/wiki/Fixed-point_combinator – pvg