Python递归函数错误:“超出最大递归深度”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python递归函数错误:“超出最大递归深度”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2089字,纯文字阅读大概需要3分钟。
内容图文
参见英文答案 > What is the maximum recursion depth in Python, and how to increase it? 15个
我使用以下代码解决了Euler项目的问题10,该代码通过强力实施:
def isPrime(n):
for x in range(2, int(n**0.5)+1):
if n % x == 0:
return False
return True
def primeList(n):
primes = []
for i in range(2,n):
if isPrime(i):
primes.append(i)
return primes
def sumPrimes(primelist):
prime_sum = sum(primelist)
return prime_sum
print (sumPrimes(primeList(2000000)))
这三个功能的工作原理如下:
> isPrime检查数字是否为素数;
> primeList返回一个列表,其中包含一组限制为“n”的特定范围的素数,并且;
> sumPrimes总结列表中所有数字的值. (不需要最后一个功能,但我喜欢它的清晰度,特别是像我这样的初学者.)
然后我编写了一个新函数primeListRec,它与primeList完全相同,以帮助我更好地理解递归:
def primeListRec(i, n):
primes = []
#print i
if (i != n):
primes.extend(primeListRec(i+1,n))
if (isPrime(i)):
primes.append(i)
return primes
return primes
上面的递归函数有效,但仅适用于非常小的值,如’500′.当我输入’1000’时,该功能导致我的程序崩溃.当我输入类似’2000’的值时,Python给了我这个:
RuntimeError:超出最大递归深度.
我的递归函数出了什么问题?或者是否有一些特定的方法来避免递归限制?
解决方法:
递归不是在Python中做事的最惯用的方式,因为它没有tail recursion优化,因此使用递归作为迭代的替代是不切实际的(即使在你的例子中函数不是尾递归的,那也不会’无论如何都要帮忙).基本上,这意味着如果你希望你的输入很大,你就不应该把它用于复杂度大于线性的东西(对于那些具有对数递归深度的事情来说,这仍然是可以的,比如像QuickSort那样划分和征服算法).
如果你想尝试这种方法,可以使用更适合进行函数式编程的语言,如Lisp,Scheme,Haskell,OCaml等;或尝试使用Stackless Python,它在堆栈使用方面有更广泛的限制,并且还具有尾递归优化:-)
顺便说一下,你的函数的尾递归等价物可以是:
def primeList(n, i=2, acc=None):
return i > n and (acc or []) or primeList(n, i+1, (acc or []) + (isPrime(i) and [i] or []))
另一个“顺便说一句”,你不应该构建一个列表,如果你只是为了将值加起来……解决Project Euler的第10个问题的Pythonic方法是:
print sum(n for n in xrange(2, 2000001) if all(n % i for i in xrange(2, int(n**0.5)+1)))
(好吧,也许在不同的行中拆分它会更加Pythonic,但我喜欢一个衬里^ _ ^)
内容总结
以上是互联网集市为您收集整理的Python递归函数错误:“超出最大递归深度”全部内容,希望文章能够帮你解决Python递归函数错误:“超出最大递归深度”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。