python - Python 递归错误:RecursionError:调用 Python 对象时超出最大递归深度
问题描述
我正在尝试构建一个接收数字的函数,然后使用递归打印出斐波那契数列并结束数列。因此,如果我有一个开始的序列,0
并且1
如果用户输入是4
,它将返回0
, 1
, 1
, 2
, 3
。我得到这个RecursionError
:
RecursionError: maximum recursion depth exceeded while calling a Python object
这是我的代码:
num = input("Give me a number.")
def fib(n):
n = int(n)
if n == 0:
return 1
return fib(n - 1) + fib(n - 2)
print(fib(num))
解决方案
两个问题
您的代码有两个问题:
- 有一个无限循环,会产生
RecursionError
异常 - 检索序列的所有项是不可能的(您说要打印所有序列,而不仅仅是最后一项)
无限循环
试试下面的代码。我只是添加n==1
了另一个停止条件。
def fib(n):
n = int(n)
if n == 0 or n == 1: # Changed here
return 1
return fib(n - 1) + fib(n - 2)
num = input("Give me a number: ")
print(fib(num))
根据定义,案例f(1)=1
是必需的(请参见此处)。
或者只是调试你的代码,你会意识到循环永远不会结束,fib(1)
因为它返回:
f(1-1) + f(1-2)
>>> f(0) + f(-1)
>>> 1 + infinite loop
。
打印所有条款
您可以尝试在递归代码中使用列表,这很棘手,或者可能更改为带有循环的版本。
带循环:
# A version using a while loop
# This code returns the list of terms
def fib(n):
n=int(n)
terms = []
i=0
while i<=n:
if i==0 or i==1:
terms.append(1)
else:
terms.append(terms[-2]+terms[-1])
i+=1
return terms
递归:
Working on it
在这里尝试所有这些示例。
推荐阅读
- r - 获取:确定数据框中 2 个变量之间的相关性时,“cor(data) 中的错误:'x' 必须是数字”
- unit-testing - 如何在 React 测试库中使用 *byRole 选择地址元素?
- ruby-on-rails - 有没有办法在不准备函数的情况下使用占位符执行查询?
- python - 我应该将抽象类放在 python 包中的什么位置?
- r - R 不再识别数据框中的变量名称
- java - 如何在不按运行按钮的情况下使程序重新运行
- c++ - 如何使用此 Logger 记录特定类别的数据类型
- android - 如何更改 Google 广告帐户的时区,
- c++ - 使用 C++ API 将 mq 客户端连接到具有加密通道的 mq 服务器
- html - 如何仅旋转按钮背景图像