【发布时间】:2013-05-16 00:11:37
【问题描述】:
我有这个脚本:
def number_of_occurences(c, message):
position = message.find(c)
if position == -1:
return 0
else:
if len(message[position:]) == 0:
return position
else:
return position + number_of_occurences(c, message[position:])
number_of_occurences('a', 'azertya')
但是当我运行它时,我得到了这个错误:
Traceback (most recent call last):
File "frequency_analysis.py", line 31, in <module>
number_of_occurences('a', 'azertya')
File "file_name.py", line 29, in number_of_occurences
return position + number_of_occurences(c, message[position:])
...
...
...
File "file_name.py", line 29, in number_of_occurences
return position + number_of_occurences(c, message[position:])
RuntimeError: maximum recursion depth exceeded
我知道这个similar question,但它没有帮助,花了更长的时间,但给出了同样的错误:
sys.setrecursionlimit(10000)
还有这个:
sys.setrecursionlimit(30000)
但是对于这个:
sys.setrecursionlimit(50000)
它给出了这个错误:
分段错误(核心转储)
我在这里做错了什么?提前致谢。
更新:
感谢@abarnet,这是正确的代码:
def number_of_occurences(c, message):
position = message.find(c)
nbr = 0.0
if position == -1:
return 0
else:
nbr += 1
if len(message[position:]) == 0:
return nbr
else:
return nbr + number_of_occurences(c, message[position + 1:])
【问题讨论】:
-
在什么方面没有帮助?
-
花费了更长的时间但给出了同样的错误。
-
问题是(a)递归限制太低,因为你需要,比如说,20000? (b) 你认为你的代码中的递归深度远低于任何合理的限制(比如低于 10)? (c) 你知道你得到了无限或太深的递归,并想知道你的代码为什么这样做?
-
如果 position 等于 0,那么你将继续递归调用。
-
尽管有一些函数式风格原语,Python 缺乏纯函数式语言中常见的尾调用优化。大多数时候,以迭代的方式重写任何递归算法是微不足道的,这是 Python 中的惯用形式。
标签: python recursion python-2.7