Y Combinator लैम्ब्डा पथरी में सबसे दिलचस्प phenomenons से एक है। मुझे संदेह है कि इसे तुरंत देखकर, कोई भी इसकी कार्यक्षमता की व्याख्या के साथ आ सकता है।
Y = f => (g => g(g))(g => n => f(g(g))(n));
चलिए कदम से व्युत्पन्न कदम को समझने की कोशिश करते हैं। मैं तीर कार्यों का उपयोग करूंगा ताकि यदि आप उनसे परिचित नहीं हैं तो कृपया this link का पालन करें। वे बहुत सरल हैं। x => x
का अर्थ है function(x){return x;}
। जेएस this
कीवर्ड के तीर के भीतर एक अलग अर्थ है लेकिन यह इस विषय के अनुसार विषय बंद है।
तो हमेशा के रूप में हम फैक्टोरियल फ़ंक्शन के साथ जाएंगे, लेकिन वाई संयोजक जिसे हम प्राप्त करेंगे, सभी रिकर्सिव कार्यों के लिए मान्य होगा।
एक भाज्य समारोह बस के रूप में
var fa = n => n === 0 ? 1 : n*fa(n-1);
fact(5) // <- 120
इस प्रकार व्यक्त किया जा सकता लेकिन कहते हैं कि हमें fa
समारोह रिकर्सिवली का उल्लेख नहीं करना चाहती; इसके बजाय हम फैक्टोरियल फ़ंक्शन के एक काल्पनिक संस्करण से एक कार्यशील फैक्टोरियल फ़ंक्शन प्राप्त करना चाहते हैं। एक काल्पनिक फैक्टोरियल समारोह क्या है? Hypothetical फैक्टोरियल समारोह एक उचित फैक्टोरियल समारोह लेता है और हमें एक कामकाजी फैक्टोरियल समारोह देता है। निम्नलिखित
var fh = f => n => n === 0 ? 1 : n*f(n-1);
की तरह तो अगर मैं fh
एक तर्क यह काम करेगा के रूप में fa
समारोह गुजरती हैं। पसंद;
fh(fa)(5); // <- 120
लेकिन हम fa
की तरह एक और भाज्य समारोह का उल्लेख करने के बाद से हम पहले से ही नहीं है चाहता हूँ "की तरह" fh
समारोह के भीतर भाज्य तर्क को परिभाषित किया। फिर हम सोचते हैं। fh
बंद होने में f
तर्क रखता है और मुझे एक कामकाजी फैक्टोरियल फ़ंक्शन (n => n === 0 ? 1 : n*f(n-1)
) देता है यदि मैं fa
जैसे उचित फैक्टोरियल फ़ंक्शन पास करता हूं। तो क्या होगा अगर मैं इसे अपने पास कर दूं; एक त्वरित प्रयास fh(fh)(5) // <- NaN
मेह ..!
तो हम आंतरिक कार्य के साथ खेलना शुरू करते हैं। आम तौर पर मैं इस कदम को पारित करता हूं लेकिन परिवर्तनों को देखना उपयोगी हो सकता है ... इसलिए जारी रखें। मैं मेरे एक समारोह जो दो तर्क लेता है, जो अपने आप और भाज्य गिनती वापस जाने के लिए fb
समारोह को परिभाषित कर सकते n
fb = (f,n) => n === 0 ? 1 : n* f(f,n-1), // fb(fb,5) <- 120
अब तक तो अच्छा है लेकिन दो तर्क भाज्य समारोह नहीं है जहां मैं क्या देख रहा हूँ के करीब है। मैं उन्हें एक और कार्यात्मक कदम जोड़कर अलग कर सकता हूं।
fc = f => n => n === 0 ? 1 : n* f(f)(n-1), // fc(fc)(5) <- 120
अब यह बहुत ही हमारे काल्पनिक समारोह fh
के करीब है। लेकिन आंतरिक शो f(f)(n-1)
हमें एफ (एन -1) दिखाने के लिए इसे सही करना होगा। अच्छी तरह से हम एक जेएस सौंदर्य IIFE का उपयोग करने में हमारी सहायता के लिए उपयोग कर सकते हैं ...
fd => f => n => ((g,n) => n === 0 ? 1 : n * (g,n-1))(f(f),n) // fd(fd)(5) <- 120
क्या आप आईआईएफई देख सकते हैं ..? ((g,n) => n === 0 ? 1 : n * g(n-1))(f(f),n)
फिर भी, यह ठीक लगता है, वांछित परिणाम प्राप्त करने के लिए मुझे दोहरी तर्क (g,n)
IIFE से छुटकारा पाना है। यह कार्यात्मक होने का एक और स्तर ले जाएगा।
fe => f => n => (g => n => n === 0 ? 1 : n * g(n-1))(f(f))(n) // fe(fe)(5) <- 120
अब हम g => n => n === 0 ? 1 : n * g(n-1)
जो हमारे काल्पनिक समारोह fh
का मुख्य भाग है अंदर है। जिसका अर्थ है कि मैं विकल्प (मुझे इस भाग से प्यार है .. कैलकुंस प्रतिस्थापन की तरह, वास्तव में यह है ...) fh
उपरोक्त फ़ंक्शन में पढ़ने के लिए;
fe => f => n => fh(f(f))(n) // fe(fe)(5) <- 120
इसे लपेटने के लिए ठीक समय। मैं पहले स्थान पर क्या चाहता था ..? मैं fh
को फ़ंक्शन (वाई-संयोजक) में फ़ीड करना चाहता हूं और इसे निश्चित बिंदु प्राप्त करना चाहता हूं। यहां मुझे पता है कि fe(fe)
fh
का उपयोग करता है और मुझे ठीक से काम कर रहे फैक्टोरियल फ़ंक्शन देता है। तो एक तर्क के रूप में हमारे हाइपोफेटिकल रिकर्सिव फ़ंक्शन को लेने के लिए एक फ़ंक्शन को परिभाषित करने दें और हमें कुछ काम करने (निश्चित) दें। IIFE फिर से मदद करने के लिए।
Y = f => (g => g(g))(g => n => f(g(g))(n));
तो यह किसी भी चीज़ के लिए काम करना चाहिए। आइए हमारे वाई संयोजक को एक काल्पनिक फाइबोनैकी फ़ंक्शन के साथ आज़माएं।
var Y = f => (g => g(g))(g => n => f(g(g))(n)),
fibH = f => n => n === 0 ? 0
: n === 1 ? 1
: f(n-2) + f(n-1),
fibo = Y(fibH);
console.log(fibo(10));
मुझे आशा है कि यह सब स्पष्ट ...
हो सकता है कि [इस] (http://stackoverflow.com/a/13759513/1048572) में मदद करता है है? – Bergi
अनंत रिकर्सन आलसी है। फ़ंक्शन को हमेशा नहीं कहा जाता है, यह बार-बार पारित होता है (और 'फैक्टोरियल' के मूल मामले में, इसका उपयोग अब और नहीं किया जाता है) – Bergi
धन्यवाद @ बर्गि मैंने आपकी मदद से इसे समझ लिया है। 'वाई (एफ) 'के बिंदु पर, रिकर्सिव संरचना' एक्स (एक्स) 'केवल एक संदर्भ है जो' फैक्टोरियल 'फ़ंक्शन के अंदर बाध्य चर' फैक्टोरियल 'के रूप में पारित और संग्रहीत होता है, इसे कॉल नहीं किया जाता है उस बिंदु पर। –