2010-09-26 5 views
6

शुरुआती :) Crockford's book से कोड टुकड़ा का एक विवरण की जरूरत है, खंड 4.15:"जावास्क्रिप्ट - गुड पार्ट्स" उदाहरण पर स्पष्टीकरण (धारा 4.15)? जे एस में

var memoizer = function (memo, fundamental) { 
    var shell = function (n) { 
     var result = memo[n]; 
     if (typeof result !== 'number') { 
      result = fundamental(shell, n); 
      memo[n] = result; 
     } 
     return result; 
    }; 
    return shell; 
}; 

var fibonacci = memoizer([0, 1], function (shell, n) { 
    return shell(n - 1) + shell(n - 2); 
}); 

प्रश्न: कैसे हम फिबोनैकी (15) की गणना करते हैं, और अगर यह सरल फिबोनैकी (15) है कॉल करें, फिर यह विस्तार से कैसे काम करता है?

सहायता के लिए धन्यवाद।

+1

fibonacci (15)? – spender

+0

मैं उम्मीद करता हूं कि पुस्तक कैसे काम करती है इस बारे में विस्तार से आगे बढ़ने की उम्मीद है - क्या विशेष रूप से कुछ भी आपको समझ में नहीं आता है? – Douglas

+1

अरे, मैंने हाल ही में जावास्क्रिप्ट का उपयोग करके मूल यादों के बारे में एक छोटा वीडियो बनाया - शायद यह ज्ञापन को समझने में मदद करता है: https://www.youtube.com/watch?v=lsp82x0XdsY –

उत्तर

1

के रूप में अपने प्रश्न का टिप्पणियां सुझाव देते हैं, आप यदि आप कर सकते हैं क्या हो रहा है की एक अच्छी समझ पाने के लिए एक डिबगर में कोड के माध्यम से चलना चाहिए पुस्तक में स्पष्टीकरण का पालन नहीं करते हैं। लेकिन मैं आपको क्या हो रहा है इसके बारे में एक संक्षिप्त अवलोकन प्रदान करूंगा:

क्या दिखाया जा रहा है 'ज्ञापन' है जो कार्यात्मक प्रोग्रामिंग में उपयोग की जाने वाली एक सामान्य अनुकूलन तकनीक है। एक समारोह शुद्ध माना जाता है यदि परिणाम केवल इसमें दिए गए तर्कों पर निर्भर करता है। इसलिए, यदि कोई फ़ंक्शन शुद्ध है तो आप तर्कों के आधार पर परिणाम कैश कर सकते हैं - इस तकनीक को ज्ञापन कहा जाता है। यदि कोई फ़ंक्शन गणना करने के लिए महंगा होता है और इसे कई बार कहा जाता है तो आप ऐसा करेंगे।

शास्त्रीय उदाहरण इसे प्रदर्शित करने के लिए उपयोग किया जाता है (यहां के रूप में) Fibonacci numbers उत्पन्न कर रहा है। मैं उन लोगों के माध्यम से नहीं जा रहा हूं कि वे कैसे काम कर रहे हैं, लेकिन मूल रूप से जब आप उच्च और उच्च संख्या में जाते हैं तो आप अपने आप को अधिक से अधिक दोहराते हैं क्योंकि प्रत्येक संख्या की गणना दो संख्याओं से पहले की जाती है। प्रत्येक इंटरमीडिएट परिणाम को याद करके आपको केवल एक बार एल्गोरिदम को तेज़ बनाने के बाद उन्हें गणना करना होगा (जितना तेज़ होगा उतना तेज़ होगा जितना आप अनुक्रम को ऊपर ले जाते हैं)।

जहां तक ​​इस कोड का संबंध है, ज्ञापनकर्ता दो पैरामीटर लेता है - 'ज्ञापन' जो कैश है। इस मामले में यह पहले से ही '[0,1]' में भरे पहले दो मानों के साथ जा रहा है - ये पहले दो फिबोनाची संख्याएं हैं।

दूसरा पैरामीटर वह कार्य है जिस पर ज्ञापन लागू किया जाएगा। इस मामले में एक रिकर्सिव फाइबोनैकी फ़ंक्शन:

फ़ंक्शन (खोल, एन) { रिटर्न शैल (एन -1) + खोल (एन -2); }

यानी परिणाम अनुक्रम में पिछले दो संख्याओं का योग है।

जांचकर्ताओं के पहले यह जांचने के लिए कि पहले से ही कैश किए गए परिणाम हैं या नहीं। अगर ऐसा होता है तो यह तुरंत लौटता है। यदि नहीं, तो यह परिणाम की गणना करता है और इसे कैश में संग्रहीत करता है। ऐसा करने के बिना यह बार-बार दोहराएगा और अनुक्रम में उच्च संख्या तक पहुंचने के लिए तेजी से धीमा हो जाता है।

+1

आपके उत्तर के लिए धन्यवाद। हालांकि मेरा अस्पष्ट हिस्सा अलग था, लेकिन मुझे पहले से ही यह मिला:) ... मैं सोच रहा था कि 'फाइबोनासी (15)' कहलाते समय '15' को 'मेमोइज़र' समारोह के शरीर में कैसे पारित किया जाता है। जवाब छोटा है :): 'ज्ञापनकर्ता' एक 'फ़ंक्शन (एन) '(' shell' चर) देता है, इसलिए var 'fibonacci' जिसे' memoizer' द्वारा लौटाया गया 'फ़ंक्शन (एन)' असाइन किया गया है 'n = 15 '। – Max

+0

@MaxP। आपकी टिप्पणी उत्तर से भी अधिक उपयोगी है क्योंकि यह समस्या भी थी, क्योंकि विशेष रूप से पुस्तक आमंत्रण कथन 1 प्रदान नहीं करती है – LogixMaster

1

समारोह का मूल्यांकन करने के लिए, आप बस इसे कॉल करने की आवश्यकता:

fibonacci(15); 

आप परिणाम देखने के लिए चाहते हैं, तो सबसे आसान तरीका होगा:

alert(fibonacci(15)); 

यदि आप ऐसा करना चाहते हैं अधिक बार, तो Firebug डाउनलोड करें, और अपनी स्क्रिप्ट के तल पर ऐसा करते हैं:

Console.log(fibonacci(15)); 

या सीधे Firebug कंसोल में इस लिखें और फिर वापसी प्रेस: ​​

fibonacci(15) 
+1

टिप्पणी के लिए धन्यवाद, मैंने थोड़ा प्रश्न संशोधित किया। मैं विस्तृत स्पष्टीकरण सुनना चाहूंगा क्यों fibonacci (15) कॉल काम करता है? 'खोल' और 'n' ऑपरेशन मेरे लिए अस्पष्ट है ... – Max

+0

बहुत यकीन है कि वह कोड के काम के माध्यम से उसे चलाने के लिए किसी की तलाश कर रहा है, नमूना इनपुट – meagar

+1

के रूप में' 15' का उपयोग करके यह देखने के लिए कि यह पूर्ण विवरण में कैसे काम करता है, आप कर सकते हैं फिर फायरबग डाउनलोड करें, फिर डीबगर का उपयोग करके फाइबोनैकी (15) पर कॉल के माध्यम से कदम उठाएं। बटन में चरण की तलाश करें। आप यह दिखाने के लिए एक घड़ी अभिव्यक्ति "एन" जोड़ सकते हैं कि एन का मान क्या बदलता है। – Douglas

3

यहां एक console.log() एनोटेटेड संस्करण है जो यह दिखाने का प्रयास करता है कि स्टैक कैसे लौटाता है और प्रत्येक संबंधित रिकर्सिव कॉल के लिए ज्ञापन सरणी (एन -1) + (एन -2) के परिणाम को असाइन करता है। यह भी याद रखें कि स्टैक रिवर्स ऑर्डर में रिटर्न देता है। तो लॉग ऑन उत्पादन में आप पिछले कॉल पहले लौट आए देखेंगे:

var memoizer = function (memo, fundamental) { 
    var shell = function (n) { 
     var result = memo[n]; 
     if (typeof result !== 'number') { 
      result = fundamental(shell, n); 
      console.log("Hence 'shell(n-1)+shell(n-2)' results in the assignment memo["+n+"]="+result); 
      memo[n] = result; 
     } 
     return result; 
    }; 
    return shell; 
}; 
var fibonacci = memoizer([0, 1], function (shell, n) { 
    console.log("shell is called, and 'n' is equal to --> " + n + "\n" + "At this point shell(n-1)="+shell(n-1)+" AND shell(n-2)="+shell(n-2)); 
    return shell(n - 1) + shell(n - 2);  
}); 
1

ऐसा लगता है कि आप क्यों मंगलाचरण fibonacci(15) काम करता लेकर असमंजस में हैं। चलिए कोड को सरल बनाते हैं (एक सेकंड के लिए ज्ञापन के बारे में भूल जाओ)।

var m = function() { 
    var s = function (n) { 
     console.log(n); 
    }; 
    return s; 
}; 
var f = m(); 

असल में हम समारोह m() के रिटर्न मान पर f की स्थापना कर रहे हैं। इस मामले में, वह वापसी मूल्य एक समारोह है। देखें, हम के रूप में आगे इसे सरल हो सकता है:

var f = function (n) { console.log(n); }; 

दूसरे शब्दों में, हम f सेट कर रहे हैं एक समारोह है कि एक पैरामीटर में ले जाता है किया जाना है। हम फिबिनैची उदाहरण में एक ही काम कर रहे हैं। यही कारण है कि आमंत्रण fibonacci(15) काम करता है।

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