如果您对Python递归函数错误:“超出了最大递归深度”和python超过最大递归深度感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Python递归函数错误:“超出了最大递归深度”的各种细节,
如果您对Python递归函数错误:“超出了最大递归深度”和python超过最大递归深度感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Python递归函数错误:“超出了最大递归深度”的各种细节,并对python超过最大递归深度进行深入的分析,此外还有关于13.0、python递归函数、Django:python manage.py runserver提供了RuntimeError:在cmp中超过了最大递归深度、PHP报错:超出最大递归深度的解决方法!、Python Tkinter:RecursionError:超过最大递归深度的实用技巧。
本文目录一览:- Python递归函数错误:“超出了最大递归深度”(python超过最大递归深度)
- 13.0、python递归函数
- Django:python manage.py runserver提供了RuntimeError:在cmp中超过了最大递归深度
- PHP报错:超出最大递归深度的解决方法!
- Python Tkinter:RecursionError:超过最大递归深度
Python递归函数错误:“超出了最大递归深度”(python超过最大递归深度)
我使用以下代码解决了Euler项目的问题10,该代码通过强力工作:
def isPrime(n): for x in range(2, int(n**0.5)+1): if n % x == 0: return False return Truedef primeList(n): primes = [] for i in range(2,n): if isPrime(i): primes.append(i) return primesdef sumPrimes(primelist): prime_sum = sum(primelist) return prime_sumprint (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:超过最大递归深度 。
我的递归函数怎么了?还是有一些特定的方法来避免递归限制?
答案1
小编典典递归不是Python中最惯用的方法,因为它没有尾递归优化,因此使用递归代替迭代是不切实际的(即使在您的示例中该函数不是尾递归,也不会仍然没有帮助)。基本上,这意味着如果您希望输入较大,则不应该将其用于复杂度大于线性的事物((对于具有对数递归深度的事物,例如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 []))
另一个“顺便说一句”,如果仅使用它来求和值,则不应构造一个列表。解决欧拉计划第10个问题的Python方法是:
print sum(n for n in xrange(2, 2000001) if all(n % i for i in xrange(2, int(n**0.5)+1)))
(好吧,也许将其拆分成更多行会更加Pythonic,但是我喜欢一个内衬^ _ ^)
13.0、python递归函数
递归函数
阅读目录
楔子
在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢......这个故事你们不喊停我能讲一天!我们说,生活中的例子也能被写成程序,刚刚这个故事,让你们写,你们怎么写呀?
while True:
story = " 从前有个山,山里有座庙,庙里老和尚讲故事,
讲的什么呢?
" print(story)
你肯定是要这么写的,但是,现在我们已经学了函数了,什么东西都要放到函数里去调用、执行。于是你肯定会说,我就这么写:
def story():
s = """
从前有个山,山里有座庙,庙里老和尚讲故事,
讲的什么呢?
""" print(s)
while True:
story()
但是大家来看看,我是怎么写的!
def story():
s = """
从前有个山,山里有座庙,庙里老和尚讲故事,
讲的什么呢?
""" print(s)
story()
story()
先不管函数最后的报错,除了报错之外,我们能看的出来,这一段代码和上面的代码执行效果是一样的。
初识递归
递归的定义——在一个函数里再调用这个函数本身
现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。
刚刚我们就已经写了一个最简单的递归函数。
递归的最大深度——997
正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...).
拿什么来证明这个“997理论”呢?这里我们可以做一个实验:
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
由此我们可以看出,未报错之前能看到的最大数字就是997.当然了,997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:
import sysprint(sys.setrecursionlimit(100000))
我们可以通过这种方式来修改递归的最大深度,刚刚我们将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了~~~
看到这里,你可能会觉得递归也并不是多么好的东西,不如while True好用呢!然而,江湖上流传这这样一句话叫做:人理解循环,神理解递归。所以你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为没能领悟递归的真谛。而且之后我们学习的很多算法都会和递归有关系。来吧,只有学会了才有资本嫌弃!
再谈递归
这里我们又要举个例子来说明递归能做的事情。
例一:
现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。
你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。
你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。
那你问金鑫,金鑫告诉你,他40了。。。
这个时候你是不是就知道了?alex多大?
1金鑫 40
2武sir 42
3egon 44
4alex 46
你为什么能知道的?
首先,你是不是问alex的年龄,结果又找到egon、武sir、金鑫,你挨个儿问过去,一直到拿到一个确切的答案,然后顺着这条线再找回来,才得到最终alex的年龄。这个过程已经非常接近递归的思想。我们就来具体的我分析一下,这几个人之间的规律。
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40
那这样的情况下,我们的函数应该怎么写呢?
def age(n):
if n == 1:
return 40
else:
return age(n-1)+2print(age(4))
递归函数与三级菜单
menu = {
''北京'': {
''海淀'': {
''五道口'': {
''soho'': {},
''网易'': {},
''google'': {}
},
''中关村'': {
''爱奇艺'': {},
''汽车之家'': {},
''youku'': {},
},
''上地'': {
''百度'': {},
},
},
''昌平'': {
''沙河'': {
''老男孩'': {},
''北航'': {},
},
''天通苑'': {},
''回龙观'': {},
},
''朝阳'': {},
''东城'': {},
},
''上海'': {
''闵行'': {
"人民广场": {
''炸鸡店'': {}
}
},
''闸北'': {
''火车战'': {
''携程'': {}
}
},
''浦东'': {},
},
''山东'': {},
}
1 def threeLM(dic): 2 while True: 3 for k in dic:print(k) 4 key = input(''input>>'').strip() 5 if key == ''b'' or key == ''q'':return key 6 elif key in dic.keys() and dic[key]: 7 ret = threeLM(dic[key]) 8 if ret == ''q'': return ''q''9 10 threeLM(menu)
还记得之前写过的三级菜单作业么?现在咱们用递归来写一下~
l = [menu]while l:
for key in l[-1]:print(key)
k = input(''input>>'').strip() # 北京 if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])
elif k == ''b'':l.pop()
elif k == ''q'':break
Django:python manage.py runserver提供了RuntimeError:在cmp中超过了最大递归深度
我正在尝试从Django项目网站上的第1篇教程学习Django。我可能会缺少一些明显的东西,但是在遵循所有说明后,当我运行命令时
python manage.py runserver
我在请求的结尾处得到了错误消息,以寻求帮助(为简便起见,我仅将错误消息的重复行的前几行发布)。
这是我在网上找到的一些解决方案/建议,但对我没有帮助。
1)sys.setrecursionlimit(1500)。
这对我不起作用。
2)。DjangoRuntimeError:超过最大递归深度
这也不是一个选择,因为我没有使用PyDeV,我尝试使用pip卸载和安装Django,但它没有解决任何问题,并且我使用的是MountainLion的本机python,因为我们不建议将其卸载。
3)。我也尝试过:
python manage.py runserver --settings=mysite.settings
与没有选项设置的命令完全相同的错误
任何建议,建议将不胜感激。我正在使用…。Django正式版。我使用pip和Python 2.7.2安装的1.5.1
Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x10f7ee5d0>>
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/django/core/management/commands/runserver.py",line 92,in inner_run
self.validate(display_num_errors=True)
File "/Library/Python/2.7/site-packages/django/core/management/base.py",line 280,in validate
num_errors = get_validation_errors(s,app)
File "/Library/Python/2.7/site-packages/django/core/management/validation.py",line 35,in get_validation_errors
for (app_name,error) in get_app_errors().items():
File "/Library/Python/2.7/site-packages/django/db/models/loading.py",line 166,in get_app_errors
self._populate()
File "/Library/Python/2.7/site-packages/django/db/models/loading.py",line 72,in _populate
self.load_app(app_name,True)
File "/Library/Python/2.7/site-packages/django/db/models/loading.py",line 96,in load_app
models = import_module('.models',app_name)
File "/Library/Python/2.7/site-packages/django/utils/importlib.py",in import_module
__import__(name)
File "/Library/Python/2.7/site-packages/django/contrib/auth/models.py",line 370,in <module>
class AbstractUser(AbstractBaseUser,PermissionsMixin):
File "/Library/Python/2.7/site-packages/django/db/models/base.py",line 213,in __new__
new_class.add_to_class(field.name,copy.deepcopy(field))
File "/Library/Python/2.7/site-packages/django/db/models/base.py",line 265,in add_to_class
value.contribute_to_class(cls,name)
File "/Library/Python/2.7/site-packages/django/db/models/fields/__init__.py",line 257,in contribute_to_class
cls._meta.add_field(self)
File "/Library/Python/2.7/site-packages/django/db/models/options.py",line 179,in add_field
self.local_fields.insert(bisect(self.local_fields,field),field)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py",line 56,in <lambda>
'__lt__': [('__gt__',lambda self,other: other < self),File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py",RuntimeError: maximum recursion depth exceeded in cmp
更新:所以我最终要做的是对安装virtualbox,在其上安装免费的ubuntu,然后继续完成本教程进行大肆宣传…哦!
PHP报错:超出最大递归深度的解决方法!
PHP报错:超出最大递归深度的解决方法!
引言:
在使用PHP开发过程中,我们常常会遇到超出最大递归深度的问题。这个问题是由递归函数调用自身过多导致的,对于初学者来说可能会感到困惑。本文将介绍这个问题的原因,并提供几种解决方法,帮助大家更好地解决这一错误。
一、问题原因:
在PHP中,递归是一种非常重要的编程技术。通过递归函数,我们可以简化问题的复杂性,使代码更加简洁和可读。然而,当递归函数调用自身次数过多时,会导致超出PHP的最大递归深度限制,从而触发错误。
二、错误信息:
当代码超出最大递归深度时,PHP会抛出一个致命错误,错误信息类似于:
"Fatal error: Maximum function nesting level of ''xxx'' reached, aborting!"
立即学习“PHP免费学习笔记(深入)”;
其中,''xxx''代表PHP的最大递归深度限制,它可以通过更改php.ini配置文件的xdebug.max_nesting_level选项进行调整。
三、解决方法:
- 优化递归算法:
在遇到超出最大递归深度的问题时,可以尝试优化递归算法。优化的方式有很多种,例如,可以将递归函数拆分成多个函数,每个函数只负责一部分计算,然后通过函数间的参数传递结果。这样可以减少递归调用次数,降低递归深度。
以下是一个简单的示例代码:
function factorial($n){ // 递归出口 if($n == 0 || $n == 1){ return 1; } // 递归调用 return $n * factorial($n - 1); }
在这个示例中,我们可以通过尾递归优化来减少递归深度。将代码修改为以下形式:
function factorial($n, $result = 1){ // 递归出口 if($n == 0 || $n == 1){ return $result; } // 递归调用 return factorial($n - 1, $result * $n); }
这样一来,递归深度减少了,即使在较大的输入时也不容易触发最大递归深度限制。
- 增加递归深度限制:
如果优化递归算法不可行,我们可以尝试增加PHP的最大递归深度限制。在php.ini配置文件中,找到xdebug.max_nesting_level选项,并将其值调整为更大的数值。
例如,将其修改为:
xdebug.max_nesting_level = 1000
这样一来,递归深度限制将变为1000,就可以容纳更多的递归调用。
需要注意的是,调整递归深度限制可能存在一定的风险。如果递归调用过多,会导致内存消耗过大,甚至引起系统崩溃。因此,在增加递归深度限制之前,需谨慎评估代码的逻辑和运行环境。
结语:
超出最大递归深度是PHP开发中常见的问题,通过优化递归算法和适当调整递归深度限制,我们可以有效地解决这一问题。希望本文提供的解决方法能够帮助大家更好地处理这个报错,并使代码开发更加顺畅。
以上就是PHP报错:超出最大递归深度的解决方法!的详细内容,更多请关注php中文网其它相关文章!
Python Tkinter:RecursionError:超过最大递归深度
如果从SlideshowModel(tk.Tk,tk.Frame)类中删除“ tk.Tk”和“ tk.Frame”会发生什么?另外,您也应该将self.grid_height替换为self.grid_h(第22行)。
今天关于Python递归函数错误:“超出了最大递归深度”和python超过最大递归深度的介绍到此结束,谢谢您的阅读,有关13.0、python递归函数、Django:python manage.py runserver提供了RuntimeError:在cmp中超过了最大递归深度、PHP报错:超出最大递归深度的解决方法!、Python Tkinter:RecursionError:超过最大递归深度等更多相关知识的信息可以在本站进行查询。
本文标签: