2015-01-27 6 views
5

मैं वाकई जावास्क्रिप्ट में अध्याय 3 के माध्यम से जा रहा हूं और रिकर्सन अभी पेश किया गया था और मैं इस अवधारणा के आसपास अपने दिमाग को लपेटने की कोशिश कर रहा हूं।क्या आप चैप 3 एलोक्वेंट जेएस से इस रिकर्सिव समाधान को समझा सकते हैं?

क्या कोई भी फ़ंक्शन में दूसरे पैरामीटर इतिहास को समझा सकता है?

क्या इतिहास पहले ही परिभाषित किया गया है?

इस पहेली पर विचार करें: संख्या 1 से शुरू करके और बार-बार या 5 जोड़कर गुणा करके, नई संख्याओं की एक अनंत राशि का उत्पादन किया जा सकता है। आप एक फ़ंक्शन कैसे लिखेंगे, जो किसी संख्या को दिया गया है, इस तरह के जोड़ों और गुणाओं के अनुक्रम को खोजने का प्रयास करता है जो उस संख्या का उत्पादन करते हैं? उदाहरण के लिए, नंबर 13 को पहले 3 से गुणा करके और फिर 5 बार जोड़कर पहुंचा जा सकता है, जबकि संख्या 15 को बिल्कुल नहीं पहुंचा जा सकता है। जब समारोह find कहा जाता है

function findSolution(target) { 
    function find(start, history) { 
    if (start == target) 
     return history; 
    else if (start > target) 
     return null; 
    else 
     return find(start + 5, "(" + history + " + 5)") || 
      find(start * 3, "(" + history + " * 3)"); 
    } 
    return find(1, "1"); 
} 

console.log(findSolution(24)); 
+0

ध्यान रखें, 'history' j है एक स्ट्रिंग, कुछ और नहीं। इन मामलों में – Nit

+1

, मुझे एक console.log() या दो वास्तव में चीजों को साफ़ कर सकता है। – dandavis

उत्तर

0

इतिहास निर्दिष्ट किया जाता है। आप इतिहास के लिए मूल्य प्रदान किए बिना find फ़ंक्शन को कॉल नहीं कर सकते हैं। याद रखें कि फ़ंक्शन इसे तब तक नहीं चलाएगा जब तक इसे कॉल नहीं किया जाता है, इसलिए इतिहास को तब तक कोई मूल्य नहीं मिलता है जब तक कि इसका मूल्य "1" लाइन return find(1, "1"); पर नहीं होता है, जब find कहा जाता है तो परिवर्तनीय इतिहास को अल्पविराम के बाद चीज के रूप में परिभाषित किया जाता है।

0

आह, मैं एक लंबे समय के लिए यह एक के खिलाफ मेरे सिर पीटने याद ...

लेखक समारोह findSolution है, जो बहुत भ्रामक

तो मैं इसे इस पुनर्लेखन है अंदर समारोह find को परिभाषित किया गया है रास्ता, आपको यह मिल जाएगा:

function find(start, history) { 
    if (start == target) 
     return history; 
    else if (start > target) 
     return null; 
    else 
     return find(start + 5, "(" + history + " + 5)") || 
      find(start * 3, "(" + history + " * 3)"); 
} 

function findSolution(target) { 
    return find(1, "1"); 
} 

console.log(findSolution(24)); 
3

console.log findSolution (24) द्वारा लौटाए गए मान को प्रिंट करेगा जहां 24 लक्ष्य है।

अब, जब फ़ंक्शन ढूंढता है Solution() निष्पादित किया जाता है, तो यह फ़ंक्शन "कॉल" को 2 पैरामीटर के साथ "ढूंढता है": प्रारंभ = 1, इतिहास = "1" फिर मुद्रित करने के लिए कुछ देता है।

"वापसी" कॉल को सेट करने के स्थान पर वापस भेजता है। जिसका अर्थ है find() को findSolution() के भीतर बुलाया जाता है, इसलिए रिटर्न एक वैल्यू वापस भेज देगा जहां इसे findSolution के भीतर बुलाया गया था।

हमारे मामले में

:

अगर शुरू === लक्ष्य

return history //(to findSolution. let's call it "H") 
return H to console.log() // prints 1 
बाकी

अगर शुरू> को लक्षित

return null //(to findSolution, let's call it N) 
return N to console.log() // prints null 

अन्यथा यदि शुरू लक्ष्य की तुलना में कम है, वापसी एक || बी

A = find(start + 5, "(" + history + " + 5)") 
B = find (start * 3, "(" + history + " * 3)") 

अर्थात् वापसी ए अगर ए सच है अन्यथा बी वापस लौटें; फ़ंक्शन रिटर्न से पहले ए या बी का मूल्यांकन किया जाता है।

खोज प्रारंभ पैरामीटर द्वारा वृद्धि के साथ बार-बार सक्रिय किया जाएगा 5 यानी:

के माध्यम से यह चरण दर चरण चलो चलते हैं

return find(1, "1") // start = 1, history = "(1 + 5)"  
return find(6, history) // start = 6, history = "(1 + 5) + 5" 
return find(11, history) // start = 11, history = "(1 + 5) + 5) + 5" 
return find(16, history) // start = 16, history = "(1 + 5) + 5) + 5) + 5" 
return find(21, history) start = 21, history = "(1 + 5) + 5) + 5) + 5) + 5" 

अब अगले मूल्य हो जाएगा 26. के बाद से 26> 22, "ढूंढें" बदले में

return find(63, history) start = 21 * 3 = 63,  
//since 63 > 24, "null" is returned where start = 16,  

प्रारंभ 16 है और 63 नहीं है क्योंकि यह एक पैरामीटर है। यह बदला नहीं गया है और आमंत्रण के दौरान हुई 5 तक वृद्धि के बारे में कुछ भी नहीं जानता है।

खोज (21 * 3, इतिहास), 48> 24 तो लौट अशक्त जहां शुरू = 11
खोज (11 * 3, इतिहास), 33> 24 तो लौट अशक्त जहां = 6
खोज शुरू (6 * 3, इतिहास), शुरू = 18 और 18 < 24 इसलिए एक सच्चाई शुरू हो जाएगी 5
वापसी का पता (18 + 5, इतिहास)
वापसी ढूंढें (23 + 5, इतिहास) 28> 24, ए है अशक्त, बी

मूल्यांकन किया जाता है ... और इतने पर और इतने पर जब तक शुरुआत बराबर है 24

संबंधित मुद्दे