是否可以使用递归对此公式进行编码

时间:2016-11-09 12:04:01

标签: python algorithm recursion

我正在尝试使用递归编写以下公式。 enter image description here 我想以不同的方式做到这一点,但由于表达式是递归的,在我看来递归是要走的路。 我知道如何将递归应用于简单问题,但在这种特殊情况下,我的理解似乎是错误的。我尝试在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-m0y=m1+m0。在我的代码中,我试图将a(l,m)系数表示为其他系数的函数,并在此基础上对递归进行编码。

1 个答案:

答案 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)递归和显式表构建之间存在许多权衡:

  1. 递归通常在调用次数方面受到更多限制(在您的情况下可能会或可能不会出现问题 - 您的原始代码中似乎存在无限递归问题)。

  2. 与使用循环的显式表构建相比,记忆递归(可以说)更容易实现。