दिलचस्प पोस्ट
पायथन: "..% (var) s .." का प्रयोग कर रहा है% स्थानीय लोगों () एक अच्छा अभ्यास है? एंड्रॉइड यूट्यूब ऐप प्ले वीडियो इन्टेंट सी # स्प्लिट ए स्ट्रिंग बाय एक स्ट्रिंग जावा में कई मापदंडों के साथ कन्स्ट्रस्ट्रक्टरों को प्रबंधित करना किया थारेसाइवरेमोटेशन जब पृष्ठभूमि में PHP के लिए ffmpeg कैसे स्थापित करें मुझे जावा में पर्ल स्क्रिप्ट को कैसे कॉल करना चाहिए? पासवर्ड के लिए Regex कम से कम आठ अक्षर, कम से कम एक नंबर और दोनों कम और अपरकेस अक्षरों और विशेष वर्ण होना चाहिए ASP.NET MVC – HTTP प्रमाणीकरण प्रॉम्प्ट एंड्रॉइड – listview स्थिति के आधार पर मद देखें एएसपी.नेट एमवीसी विशेषता के साथ काम करने के लिए ELMAH कैसे प्राप्त करें? पायथन में लिनक्स कंसोल विंडो चौड़ाई कैसे प्राप्त करें इंटरफ़ेस स्थिरांक का क्या उपयोग है? चार एस और चार * एस में क्या अंतर है? एक सरणी में प्रत्येक आइटम की जावा गणना घटना

मैं अजगर में रिकर्सिव फ़ंक्शन कैसे बना सकता हूं?

मैं अजगर में रिकर्सिव फ़ंक्शन कैसे बना सकता हूं?

वेब के समाधान से एकत्रित समाधान "मैं अजगर में रिकर्सिव फ़ंक्शन कैसे बना सकता हूं?"

मैं सोच रहा हूँ कि क्या आप "पुनरावर्ती" का मतलब है तथ्यात्मक कार्य की गणना करने के लिए यहां एक पुनरावर्ती समारोह का एक सरल उदाहरण है:

def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1) 

रिकर्सिव एल्गोरिदम के दो मुख्य तत्व हैं:

  • समाप्ति स्थिति: n == 0
  • कटौती चरण जहां फ़ंक्शन प्रत्येक बार छोटी संख्या के साथ स्वयं कहता है: factorial(n - 1)

अजगर में पुनरावर्ती एक अन्य भाषा में पुनरावर्ती के रूप में कार्य करता है, जिसमें स्वयं के संदर्भ में रिकर्सिव निर्माण परिभाषित किया गया है:

उदाहरण के लिए एक रिकर्सिव वर्ग द्विआधारी पेड़ (या किसी पेड़) हो सकता है:

 class tree(): def __init__(self): '''Initialise the tree''' self.Data = None self.Count = 0 self.LeftSubtree = None self.RightSubtree = None def Insert(self, data): '''Add an item of data to the tree''' if self.Data == None: self.Data = data self.Count += 1 elif data < self.Data: if self.LeftSubtree == None: # tree is a recurive class definition self.LeftSubtree = tree() # Insert is a recursive function self.LeftSubtree.Insert(data) elif data == self.Data: self.Count += 1 elif data > self.Data: if self.RightSubtree == None: self.RightSubtree = tree() self.RightSubtree.Insert(data) if __name__ == '__main__': T = tree() # The root node T.Insert('b') # Will be put into the left subtree T.Insert('a') # Will be put into the right subtree T.Insert('c') 

जैसा कि पहले ही उल्लेख किया गया है कि रिकर्सिव संरचना में एक समाप्ति स्थिति होनी चाहिए। इस वर्ग में, यह इतना स्पष्ट नहीं है क्योंकि यह केवल दोहराता है अगर नए तत्व जोड़े जाते हैं, और केवल एक ही समय अतिरिक्त होता है

यह भी ध्यान देने योग्य है कि, अजगर के रूप में डिफ़ॉल्ट रूप से उपलब्ध रिकर्सन की गहराई तक सीमित है, ताकि कंप्यूटर की सभी स्मृति को अवशोषित न करें। मेरे कंप्यूटर पर यह 1000 है। मुझे नहीं पता कि यह हार्डवेयर के आधार पर बदलता है, आदि। तुम्हारा देखने के लिए:

 import sys sys.getrecursionlimit() 

और इसे सेट करने के लिए:

 import sys #(if you haven't already) sys.setrecursionlimit() 

संपादित करें: मैं यह नहीं बता सकता कि मेरी द्विआधारी पेड़ सबसे कुशल डिजाइन है अगर कोई इसे सुधार सकता है, तो मुझे यह सुनकर खुशी होगी कि कैसे

मान लें कि आप बनाना चाहते हैं: u (n + 1) = f (u (n)) के साथ u (0) = u0

एक समाधान एक साधारण पुनरावर्ती समारोह को परिभाषित करना है:

 u0 = ... def f(x): ... def u(n): if n==0: return u0 return f(u(n-1)) 

दुर्भाग्य से, यदि आप यू के उच्च मूल्यों की गणना करना चाहते हैं, तो आप एक स्टैक अतिप्रवाह त्रुटि में चले जाएंगे।

एक अन्य समाधान एक सरल लूप है:

 def u(n): ux = u0 for i in xrange(n): ux=f(ux) return ux 

लेकिन यदि आप n के विभिन्न मानों के लिए यू के कई मान चाहते हैं, तो यह उप-परिक्रम है आप एक सरणी में सभी मानों को कैश कर सकते हैं, लेकिन आप मेमोरी त्रुटि से बाहर हो सकते हैं। आप इसके बजाय जनरेटर का उपयोग करना चाह सकते हैं:

 def u(n): ux = u0 for i in xrange(n): ux=f(ux) yield ux for val in u(1000): print val 

कई अन्य विकल्प हैं, लेकिन मुझे लगता है कि ये मुख्य हैं

रिकर्सिव फ़ंक्शन का उदाहरण:

 def recursive(string, num): print "#%s - %s" % (string, num) recursive(string, num+1) 

इसके साथ चलाएं:

 recursive("Hello world", 0)