【问题标题】:Maximum recursion depth exceeded超出最大递归深度
【发布时间】:2013-12-01 04:41:46
【问题描述】:

我收到“超出最大递归深度”错误。

#Defining an example function here
def f(x):
    return e**(-2*x)

#命令 def 辛普森一家 (a,b):
c = (a+b)/2 返回 (b-a)/6*f(a)+4*f(c)+f(b)

#The Adaptive Simpson's formula
def adaptive_simpsons(a,b,tol,comparison):
    c = (a+b)/2
    left = simpsons(a,c)
    right = simpsons(c,b)
    if abs((left + right - comparison)/15) < tol:
        return (left + right - comparison)/15 + left + right
    else:
        return adaptive_simpsons(a,c,tol/2,left) + adaptive_simpsons(c,b,tol/2,right)

但是,当我打印时:

print adaptive_simpsons(a,b,tol, simpsons(a,b)), 

我收到错误“超出最大递归深度”

我的代码是不是做错了什么,还是真的需要多次循环这个递归公式?而且,我将如何解决这个问题?

【问题讨论】:

  • 您可以尝试在adaptive_simpsons函数的开头打印abtolcomparison的值,看看哪里出错了。如果代码是正确的,那么,正如其他人所建议的,您需要将其更改为迭代而不是使用递归。
  • 或许您不应该减少tol 的值?我想这使得函数永远不会达到基本情况。

标签: python recursion max


【解决方案1】:

遗憾的是,Python 没有进行尾调用优化。因此,您将不得不序列化您的递归。

为了使 TCO 正常工作,您还需要重构您的函数(可能添加一个累加器参数)以使其成为尾调用。

【讨论】:

  • 我猜代码有问题。二分搜索不应超过 50 次递归调用才能获得合理的结果。我怀疑减少tol(我认为它代表“容忍”)是这里的问题。
  • @justhalf 这很有可能。尽管如此,python 中没有 TCO 的递归问题仍然存在,并且是我的一个小烦恼。 :-)
  • 您一直提到的 TCO 是多少?
  • @justhalf:尾调用优化。大多数函数式语言都会在后台为您做到这一点,但不幸的是 Python 没有。
  • @har.cruz1972 更好地查看 wiki 上的 C 实现并将其移植到 python。那里的python解决方案完全是垃圾。
【解决方案2】:

simpsons 有错误

def simpsons(a,b):   
    c = (a + b) / 2  #        V-here     and    here-V
    return abs((b - a) / 6) * (f(a) + 4 * f(c) + f(b))

另外,既然你似乎在使用 Python2,你应该有

from __future__ import division

在模块的开头

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 2011-12-31
    • 2017-08-09
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多