मैं हाल ही में जावा में कोड के इस टुकड़े में आया था। इसमें फंक्शन और प्रिंटिंग फाइबोनैकी संख्या शामिल है और यह काम करता है।जावा में रिकर्सिव लैम्ब्डा कॉल का यह टुकड़ा कैसे काम करता है
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
के साथ कॉल करते रहते हैं। मेरे लिए, इस रिकर्सिव कॉल से वापस आने के लिए कोई आधारभूत मामला नहीं है। एक अंतहीन रिकर्सिव कॉल के परिणामस्वरूप कोई ओवरफ़्लो क्यों नहीं है?
'वाई (च)' कॉल एक लैम्ब्डा के अंदर है , और वह लैम्ब्डा केवल तभी निष्पादित हो जाता है जब 'एफ' इसे कॉल करने का विकल्प चुनता है। – 4castle
https://en.wikipedia.org/wiki/Fixed-point_combinator – pvg