Python 斐波那契数打印不超过F(996)
我写了这个小片段来计算斐波那契数。它适用于996之前的数字,从997开始可以打印回溯。我想不出是什么问题。它是否与最大递归计数有关Python 斐波那契数打印不超过F(996),python,Python,我写了这个小片段来计算斐波那契数。它适用于996之前的数字,从997开始可以打印回溯。我想不出是什么问题。它是否与最大递归计数有关 def fib(n): if n==0: return 0 elif n==1: return 1 else: return fib(n-1)+n 有一个很棒的Fibonnaci函数实现不使用递归。有一个很棒的Fibonnaci函数实现不使用递归。您的代码可能会遇到堆栈调用限制。您的代码可能会遇到堆栈调用限制。可能。看一看。默认值为1000,这听
def fib(n):
if n==0:
return 0
elif n==1:
return 1
else:
return fib(n-1)+n
有一个很棒的Fibonnaci函数实现不使用递归。有一个很棒的Fibonnaci函数实现不使用递归。您的代码可能会遇到堆栈调用限制。您的代码可能会遇到堆栈调用限制。可能。看一看。默认值为1000,这听起来可能是您看到的问题的原因:一旦堆栈上有1000帧(即略少于1000个递归函数调用),您将在下一次函数调用时出错 您可以使用
sys.setrecursionlimit
将递归限制设置为更大的值,但存在一个与平台相关的最大值(这意味着您可能需要通过反复试验来确定它是什么)。可能。看一看。默认值为1000,这听起来可能是您看到的问题的原因:一旦堆栈上有1000帧(即略少于1000个递归函数调用),您将在下一次函数调用时出错
您可以使用
sys.setrecursionlimit
将递归限制设置为更大的值,但存在一个与平台相关的最大值(这意味着您可能需要通过反复试验来确定它是什么)。您已达到最大递归深度限制。据我所知,它的默认值大约是1000。您可以更改它sys.setrecursionlimit(),并使用sys.getrecursionlimit()查看它。您已达到最大递归深度限制。据我所知,它的默认值大约是1000。您可以将其更改为sys.setrecursionlimit(),并使用sys.getrecursionlimit()查看它。您可以说“它适用于996以下的数字”。。。不,它不会,它会产生错误的结果。最后一行应该是:
return fib(n - 1) + fib(n - 2)
你说“它适用于996以下的数字”。。。不,它不会,它会产生错误的结果。最后一行应该是:
return fib(n - 1) + fib(n - 2)
个人说明:我在10^600之前的解释器中运行此函数,并在不到5秒内获得所有数字。个人说明:我在10^600之前的解释器中运行此函数,并在不到5秒内获得所有数字。当你问这样的问题时,你应该始终张贴堆栈跟踪。@Steven:如果是堆栈溢出问题是回溯将是巨大的。。。但是,是的,结尾的一段摘录会很有帮助。这不是Fibonnaci序列。@David Zaslavsky:是的,但问题基本上是说“正在打印堆栈跟踪。”没有提到错误。虽然我们假定这是一个堆栈溢出,但实际上我们没有看到它是。。。养成这个好习惯;-)当你问这样的问题时,你应该始终发布堆栈跟踪。@史蒂文:如果是堆栈溢出问题,那么回溯将是巨大的。。。但是,是的,结尾的一段摘录会很有帮助。这不是Fibonnaci序列。@David Zaslavsky:是的,但问题基本上是说“正在打印堆栈跟踪。”没有提到错误。虽然我们假定这是一个堆栈溢出,但实际上我们没有看到它是。。。养成这个好习惯;-)问题是,这是计算斐波那契数的糟糕方法。计算第n个斐波那契数需要O(2^n)个递归调用。那么对于小到50的n,你真的想做那么多的工作吗?@woodchips:另一方面,这至少是一种正确的方法。如果我的答案不一定是正确的,我可以非常快地得出答案。这是对原来计算斐波那契数的改进。@woodchips:是的,递归通常效率很低。首先要做的是使它正确。如果OP头脑中没有正确的关系
f(n)=f(n-1)+f(n-2)
?一旦他得到了这一点,并针对(比如)n@woodchips的手动计算验证了递归函数。。是的,我理解这个问题有多严重,我试图用它来实现动态规划技术。为了提高运行的tym,在测试改进版本与此版本的性能时,我得到了这个错误。问题是,这是一种计算斐波那契数的糟糕方法。计算第n个斐波那契数需要O(2^n)个递归调用。那么对于小到50的n,你真的想做那么多的工作吗?@woodchips:另一方面,这至少是一种正确的方法。如果我的答案不一定是正确的,我可以非常快地得出答案。这是对原来计算斐波那契数的改进。@woodchips:是的,递归通常效率很低。首先要做的是使它正确。如果OP头脑中没有正确的关系f(n)=f(n-1)+f(n-2)
?一旦他得到了这一点,并针对(比如)n@woodchips的手动计算验证了递归函数。。是的,我理解这个问题有多严重,我试图用它来实现动态编程技术。为了改进运行的tym,在测试改进版本与此版本的性能时,我得到了这个错误。