Python 是否可以使用递归对这个公式进行编码
我试图使用递归编写以下公式。 我想用不同的方法来实现它,但是由于表达式是递归的,在我看来递归是一种方法。 我知道如何将递归应用于简单问题,但在这个特殊情况下,我的理解似乎是错误的。我试图用python编写代码,但是代码失败了,出现了消息Python 是否可以使用递归对这个公式进行编码,python,algorithm,recursion,Python,Algorithm,Recursion,我试图使用递归编写以下公式。 我想用不同的方法来实现它,但是由于表达式是递归的,在我看来递归是一种方法。 我知道如何将递归应用于简单问题,但在这个特殊情况下,我的理解似乎是错误的。我试图用python编写代码,但是代码失败了,出现了消息 RuntimeError: maximum recursion depth exceeded 因此,我想问什么是编写这个表达式的最佳方式,递归是否可能 我尝试的python代码是: def coeff(l,m,m0,m1): if l==0 and m
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))
def系数(l、m、m0、m1):
如果l==0且m==0:
返回1。
如果l==1和m==0:
返回-(m1+m0)/(m1-m0)
如果l==1和m==1:
返回1./(m1-m0)
elif ml:
返回0。
其他:
返回-((l+1。)*(m1-m0))/((2.*l+1。)*(m1+m0))*\
((2.*l+1。)*(m+1。)/((l+1。)*(2.*m+3。)*(m1-m0))*系数(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.)*系数(l-1,m,m0,m1))
其中
x=m1-m0
和y=m1+m0
。在我的代码中,我试图将a(l,m)
系数表示为其他系数的函数,并在此基础上对递归进行编码 这里是一个幼稚的递归实现,显然会一遍又一遍地重新计算相同的内容。存储以前计算过的东西可能是值得的。这可以通过显式地填写一个表来完成,也可以隐式地通过记忆来完成(因此我并不真正同意关于“递归与动态编程”的评论)
例如,使用
你可以把它写成
@memoize
def calc_a(l, m, x, y):
if l == 0 and m == 0:
return 1
# Rest of formula goes here.
请注意,同一链接包含在调用之间缓存的版本
在(记忆化)递归和显式表构建之间有许多折衷:
动态编程可能更适合这种情况。我会尽量避免递归。DP似乎是一个更好更快的解决方案。你怎么称呼coeff(…)?还有,“rin”是什么意思?@Ukimiku我会用
coeff(1,2,-0.8,1.)之类的东西来称呼它。
@GáborErdős ok,所以你基本上是建议用循环来编码。谢谢你的回复,但不幸的是,我仍然得到运行时错误:超过了最大递归深度
@AlexanderCska您的coeff
调用coeff
或rin
?它调用coeff
,另一个名称只是个错误。否则它就不会是递归。谢谢你指出,我改正了错误。无论如何,我认为这个公式是错误的。因为它要求a(l,m+1)
而我们没有任何m+1
术语。@AlexanderCska这正是无限递归(只是在公式中没有注意到)。从数学上讲,这是一个不明确的定义;代码表现为无限递归。当你找到正确的公式时,如果公式有重叠的子问题,我建议你仍然使用记忆。为了得到正确的想法,我应该如何修改公式以使递归工作。
@memoize
def calc_a(l, m, x, y):
if l == 0 and m == 0:
return 1
# Rest of formula goes here.