Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以使用递归对这个公式进行编码_Python_Algorithm_Recursion - Fatal编程技术网

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

我试图使用递归编写以下公式。 我想用不同的方法来实现它,但是由于表达式是递归的,在我看来递归是一种方法。 我知道如何将递归应用于简单问题,但在这个特殊情况下,我的理解似乎是错误的。我试图用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)) 
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.