2017-09-21 24 views
7

के साथ रिकर्सन को समझना मैं रिकर्सन को बेहतर ढंग से समझने की कोशिश कर रहा हूं और रिटर्न स्टेटमेंट कैसे काम करता हूं। इस प्रकार, मैं किसी दिए गए शब्द से जुड़े फाइबोनैकी संख्या की पहचान करने के लिए कोड का एक टुकड़ा देख रहा हूं - इस मामले में, 4. मुझे अन्य कथन को समझने में कठिनाई हो रही है।फिबोनाची सीरीज

def f(n): 
    if n == 0: 
    return 0 
    if n == 1: 
    return 1 
    else: 
    return f(n-1) + f(n-2) 

f(4) 

मैं कल्पना अजगर का उपयोग कर जांच करने के लिए क्या हर कदम पर होता है की कोशिश की है, लेकिन मैं खो दिया हो, जब यह किसी और बयान करता है।

ऐसा लगता है कि यह एन का मान ले रहा है और 1 का एक नया एन मान बनाने के लिए 1 को घटाना है, जो फ़ंक्शन परिभाषा पर वापस आता है। तो ऐसा लगता है कि यह केवल दूसरे कथन में पहले फंक्शन से मूल्य लौटा रहा है। हालांकि, अन्य कथन 2 फ़ंक्शन f (n-1) + f (n-2) की राशि वापस करने के लिए लिखा गया है, जिस स्थिति में मैंने सोचा था कि वापसी मूल्य 5 होगा? क्या आप एक साथ 2 कार्य भी जोड़ सकते हैं?

आपकी मदद के लिए अग्रिम धन्यवाद।

यहाँ संदेह होने पर, बस इसे तोड़ने के नीचे कल्पना अजगर Sum of 2 functions

+3

यह दो कार्यों को जोड़ने नहीं है, यह पूर्णांकों एक समारोह के लिए दो कॉल द्वारा वापस जोड़ने है। प्रत्येक कॉल पूरी तरह से स्वतंत्र है, विशेष रूप से प्रत्येक के पास 'n' के लिए अपना निजी मूल्य होता है। – jasonharper

उत्तर

20

में कोड करने के लिए एक कड़ी है।

enter image description here

पेड़ प्रवाह वास्तव में वास्तविक नियंत्रण प्रवाह करने के लिए जवाबी सहज है, लेकिन एक बार आप कॉल के अनुक्रम को समझते हैं, यह स्पष्ट हो जाता है। यहां समझने की बात यह है कि आप छोटे कंप्यूटेशंस के लिए एक बड़ी गणना को तोड़ते रहते हैं, और जब आप बेस केस (if कथन) दबाते हैं तो आप रुक जाते हैं। अब आप सभी छोटे कंप्यूटेशंस को पूरा कर सकते हैं, और उन छोटे कंप्यूटेशंस के परिणामों को एक बड़े, बड़े परिणाम के रूप में संयोजित कर सकते हैं, जब तक कि आपका अंतिम उत्तर न हो।

हर बार जब एक रिकर्सिव कॉल बेस केस हिट करता है, तो यह किस मामले पर मारा गया था, यह 1 या 0 लौटाएगा। यह मान पिछले कॉलर पर वापस कर दिया जाएगा। समझने के लिए, विचार करें:

f(1)3 + f(0)3

यहां नोट करें कि सबस्क्रिप्ट रिकर्सन कॉल पेड़ की गहराई का प्रतिनिधित्व करता है। कॉल f(2)2 द्वारा बनाई गई है। f(1)3 पहले गणना की गई है, और 1f(2)2 पर वापस आ गया है। f(0)3 तब गणना की जाती है, और 0f(2)2 पर वापस आ गया है। दो रिटर्न मानों को सारांशित किया गया है, और परिणाम 1 है।

f(2)2 तो रिटर्न1 जो कोई भी यह, जो इस मामले में क्या होता है कहा जाता है के लिए f(3)1 किया जाना है। f(3)1f(2)2 + f(1)2 कहा जाता है, इस बीच यह अन्य f(1)21 से f(3)1 पर भी लौटाता है, जो बनाने के लिए f(2)2 के परिणाम के साथ अब जोड़ता है।

f(3)1 अब गुजरता 2f(4)0 करने के लिए अपने फोन करने वाले है, जो f(3)1 + f(2)1 कॉल करने के लिए हुआ ... और इसलिए यह हो जाता है। f(4)0:


इस को देखने का एक वैकल्पिक तरीका पहले समारोह कॉल है कि वास्तव में किया जाता है से शुरू करने के लिए है।

f(4)0f(3)1 + f(2)1 की गणना करता है। लेकिन f(3)1 की गणना करने के लिए, इसे f(2)2 + f(1)2 जानने की आवश्यकता है, और इसी तरह, f(2)1 की गणना करने के लिए, इसे f(1)2 + f(0)2, और इसी तरह की जानना आवश्यक है।

+0

यह शानदार है। धन्यवाद। मैं अभी भी अन्य कथन में '+' चिह्न के बारे में उलझन में हूं, जो एक ऑपरेटर है, लेकिन स्पष्ट रूप से अन्य कथन में ऐसा नहीं करता है। क्या कोई इसके लिए स्पष्टीकरण दे सकता है? एक और नोट पर, मैं जिस विज़ुअलाइज़र का उपयोग कर रहा था वह दो कार्यों को प्रदर्शित नहीं करता था। यह केवल पहले समारोह से परिणाम दिखा रहा था। पता नहीं क्यों वह मामला था, लेकिन यह मुझे उलझन में डाल दिया। – efw

+1

@efw मैं समझता हूं कि आप कहां से आ रहे हैं। जैसा कि मैंने उल्लेख किया है, रिकर्सन पेड़ उस वास्तविक कॉल स्टैक के लिए थोड़ा सा अंतर्ज्ञानी है। यह एफ (4) 0 -> एफ (3) 1 -> एफ (2) 2 -> एफ (1) 3 -> 1 -> एफ (0) 3 -> 0 -> एफ (1) 2 - > ... और इतने पर। पायथन में बाएं से दाएं मूल्यांकन। रिकर्सन पेड़ की जांच करते समय, हम स्तर के अनुसार पार करते हैं। यह वास्तव में निष्पादन के दौरान वास्तव में कैसे किया जाता है। –

+0

मुझे लगता है कि अब मैं इसे समझता हूं। कोड पहले रिकर्सन की प्रक्रिया के माध्यम से, अन्य कथन पर, एन मानों की "सूची" बना रहा है। आखिरकार, एन मान दो सशर्तयों में से एक को संतुष्ट करते हैं जिस पर बिंदु पूर्णांक मान लौटाए जाते हैं, जिनमें से कुल अंतिम चरण में सम्मिलित होते हैं। आपकी सहायता के लिए एक बार फिर से धन्यवाद। – efw

1

कुछ प्रिंट बयान जोड़ने से भी अनुक्रम स्पष्ट मदद कर सकते हैं:

def f(n): 
    print("Number received:", n) 
    if n == 0: 
     return 0 
    if n == 1: 
     return 1 
    else: 
     print("---- First recursion ----") 
     a = f(n-1) 
     print("---- Second recursion ----") 
     b = f(n-2) 
     print(" a=:",a,"; b=",b,"; returning:", a+b) 
     return a + b 

print("Final f(4)=", f(4)) 

आउटपुट:

Number received: 4 
---- First recursion ---- 
Number received: 3 
---- First recursion ---- 
Number received: 2 
---- First recursion ---- 
Number received: 1 
---- Second recursion ---- 
Number received: 0 
a=: 1 ; b= 0 ; returning: 1 
---- Second recursion ---- 
Number received: 1 
a=: 1 ; b= 1 ; returning: 2 
---- Second recursion ---- 
Number received: 2 
---- First recursion ---- 
Number received: 1 
---- Second recursion ---- 
Number received: 0 
a=: 1 ; b= 0 ; returning: 1 
a=: 2 ; b= 1 ; returning: 3 
Final f(4)= 3 
संबंधित मुद्दे