我正在尝试使用递归编写以下公式。 我想以不同的方式做到这一点,但由于表达式是递归的,在我看来递归是要走的路。 我知道如何将递归应用于简单问题,但在这种特殊情况下,我的理解似乎是错误的。我尝试在python中编写代码,但代码失败并显示消息
RuntimeError: maximum recursion depth exceeded
因此,我想问一下编码这个表达式的最佳方法是什么,以及是否可以进行递归。
我试过的python代码是:
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)
系数表示为其他系数的函数,并在此基础上对递归进行编码。
答案 0 :(得分:2)
这里一个天真的递归实现,显然会一遍又一遍地重新计算相同的事情。存储先前计算的东西可能是值得的。这可以通过明确填写表格来实现,也可以通过memoization隐式地完成(因此我并不真正同意关于&#34;递归与动态编程的评论&#34;)。
,例如,使用this decorator,
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.
请注意,同一链接包含一个在调用之间缓存的版本。
(memoized)递归和显式表构建之间存在许多权衡:
递归通常在调用次数方面受到更多限制(在您的情况下可能会或可能不会出现问题 - 您的原始代码中似乎存在无限递归问题)。
与使用循环的显式表构建相比,记忆递归(可以说)更容易实现。