मैं पुनरावर्तन का उपयोग करके निम्न सूत्र को कोड करने का प्रयास कर रहा हूं। मैं इसे अलग-अलग तरीकों से करने की सोच रहा था, लेकिनचूंकि अभिव्यक्ति पुनरावर्ती है, मेरी राय में पुनरावृत्ति जाने का रास्ता है। मुझे पता है कि सरल समस्याओं के लिए पुनरावर्तन कैसे लागू किया जाए, लेकिन इस विशेष मामले में मेरी समझ गलत है। मैंने इसे अजगर में कोड करने की कोशिश की, लेकिन संदेश के साथ कोड विफल हो गया
RuntimeError: maximum recursion depth exceeded
इसलिए, मैं पूछना चाहता हूं कि इस अभिव्यक्ति को कोड करने का सबसे अच्छा तरीका क्या है और क्या पुनरावृत्ति संभव है।
अजगर कोड मैंने कोशिश की है:
def coeff(l,m,m0,m1):
if l==0 and m==0:
return 1.
elif l==1 and m==0:
return -(m1+m0)/(m1-m0)
elif l==1 and m==1 :
return 1./(m1-m0)
elif m<0 or m>l:
return 0.
else:
return -((l+1.)*(m1-m0))/((2.*l+1.)*(m1+m0))*
((2.*l+1.)*(m+1.)/((l+1.)*(2.*m+3.)*(m1-m0))*coeff(l,m+1,m0,m1) +
(2.*l+1.)*m/((l+1.)*(2.*m-1.)*(m1-m0))*coeff(l,m-1,m0,m1) -
l/(l+1.)*coeff(l-1,m,m0,m1))
कहा पे x=m1-m0
तथा y=m1+m0
। अपने कोड में मैंने व्यक्त करने की कोशिश की a(l,m)
दूसरों के कार्य के रूप में गुणांक और उसके आधार पर पुनरावृत्ति कोड।
उत्तर:
जवाब के लिए 2 № 1एक भोली पुनरावर्ती कार्यान्वयन यहाँ, जाहिर हैएक ही चीज़ को बार-बार याद करना। यह संभवतः पहले गणना की गई चीजों को स्टोर करने के लिए भुगतान करता है। यह या तो स्पष्ट रूप से एक तालिका को भरने के द्वारा किया जा सकता है, या संस्मरण द्वारा स्पष्ट किया जा सकता है (इसलिए मैं वास्तव में "पुनरावृत्ति बनाम गतिशील प्रोग्रामिंग" के बारे में टिप्पणियों से सहमत नहीं हूं)।
जैसे, उपयोग करना इस डेकोरेटर,
class memoize(dict):
def __init__(self, func):
self.func = func
def __call__(self, *args):
return self[args]
def __missing__(self, key):
result = self[key] = self.func(*key)
return result
आप इसे लिख सकते हैं
@memoize
def calc_a(l, m, x, y):
if l == 0 and m == 0:
return 1
# Rest of formula goes here.
ध्यान दें कि उसी लिंक में एक संस्करण है जो इनवोकेशन के बीच कैश करता है।
(ज्ञापन) पुनरावृत्ति और स्पष्ट तालिका निर्माण के बीच कई ट्रेडऑफ़ हैं:
रिकर्सियन आम तौर पर इनवोकेशन की संख्या में अधिक सीमित है (जो आपके मामले में एक मुद्दा नहीं हो सकता है या नहीं हो सकता है - आपको लगता है कि आपके मूल कोड में एक अनंत पुनरावृत्ति समस्या है)
एक लूप के साथ स्पष्ट तालिका निर्माण की तुलना में लागू करने के लिए ज्ञापन पुनरावृत्ति (यकीनन) सरल है।