如何解决在Python的Fibonacci系列中返回整数
我正在尝试构建一个函数,该函数将使用n并返回Fibonacci系列中的第n个整数。 例如: 斐波那契数列:
1,1,2,3,5,8,13,21,.....
如果函数是斐波那契,则它将返回:Fibonacci(8)= 21
现在,我正在编写如下函数:
def Fibonacci(a):
ls = []
for i in range(0,a):
if i==0 or i==1:
n=1
elif i>=2:
n=ls.append(ls[i-1]+ls[i-2])
print(n)
Fibonacci(8)
哪个显示错误:
IndexError: list index out of range
有解决方案吗?
解决方法
该代码即将运行,这里有一些见解和改进:
- 该列表为空,因此您在第7行遇到了一个异常,该异常试图访问过去的元素
- 使用
[1,1]
初始化列表(如果您希望使用fib(8)=21
) -
append
没有返回值 - 使用函数名使用小写字母,并使用下划线分隔单词
def fibonacci(a):
ls = [1,1]
for i in range(2,a):
ls.append(ls[i - 1] + ls[i - 2])
return ls[-1]
# 21
print(fibonacci(8))
奖励事实:
使用数学技巧,您只需很少的数学运算即可找到第n个数字(而不是遍历过去的值):
import math
SQRT_5 = math.sqrt(5)
def fibonacci(n):
return int(((((1 + SQRT_5) / 2) ** n) / SQRT_5) + 0.5 )
在Wikipedia的“与黄金比例的关系”中了解更多信息。
,附加到列表对于斐波那契数的实现没有意义;您只需要存储最后两个数字,因为所有先前的数字都不再计入计算中:
def fib(n):
a,b = 0,1
for i in range(n):
a,b = b,a + b
return a
可以说,这有点像该系列在Python中的“规范”实现。
实施中的特定问题是,您的列表最初是空的,并且没有填充i
, IndexError
以及如何跟踪错误
IndexError
只能通过尝试访问列表中的项目来触发;这只会在代码中的n=ls.append(ls[i-1]+ls[i-2])
行上发生。
为帮助调试,您可以在该行之前添加一个print
语句,并打印i
和ls
,以便在程序崩溃时知道变量的值。 / p>
错误以及解决方法
在这种情况下,答案很简单:列表ls
开始为空,并且您尝试在向列表添加任何元素之前访问ls[i-1] and ls[i-2]
。
我建议使用[0,1]
初始化列表,因为这是前两个斐波那契值,并且是您从未在当前代码中附加到列表中的唯一值。
第二个错误和最终更正的代码
此外,ls.append(...)
会将元素添加到ls
,但不会返回值,因此,在添加值之后,应将其存储在n
中,并额外添加一行{{ 1}}。请注意,在python中,“位置n = ls[-1]
中的元素只是列表中最后一个元素 ie 中位置-1
的元素的简写。
len(ls) - 1
请注意,我调用了函数def fibonacci(a):
ls = []
for i in range(0,a):
if i==0 or i==1:
ls = [0,1]
n=1
elif i>=2:
ls.append(ls[i-1]+ls[i-2])
n = ls[-1]
print(n)
而不是fibonacci
。您可能会认为这是个人喜好,但是编程语言有时具有完善的约定和样式习惯。我建议用小写字母命名变量和函数。保留大写字母用于类名和异常。
进一步改进代码
计算Fibonacci
时,唯一需要的值是Fibonacci(a)
和Fibonacci(a-1)
。不需要将先前值的整个列表保存在内存中;您需要保留的只是前两个值。尝试编写一个新的Fibonacci函数,其逻辑与以前相同,但仅在内存中保留两个值而不是整个列表!
其他人已经指出了如何修复您的代码,但是我想从图纸开始。斐波那契问题是解决递归的一种非常好的方法-如果您还没有这样做的话。与遍历列表相比,此处的递归函数将更具可读性,并且可能更快。
在线上有数百种针对Fibonacci问题的可行解决方案,例如here。
,这是因为到达i> = 2时数组中没有元素,因此您应该更改此行
n = 1
到
ls.append(1)
因为否则当您稍后尝试访问它时,数组中将没有元素
然后
return ls[-1]
或
print ls[-1]
这样计算斐波那契数也更加有效:
def fib(n):
a,b = 1,1
for i in range(n-1):
a,a+b
return a
,
def fibonacci(n):
ls = []
for i in range(0,n):
if (i==0) or (i==1):
n=1
ls.append(n)
elif i>=2:
ls.append(ls[-1]+ls[-2])
n=ls[-2] + ls[-3]
print(n)
while(True):
x = int(input())
fibonacci(x)
我们创建了一个列表,如果n> = 2,我们添加了新元素,即最后2个元素的和。 然后我们打印了新的最后2和3.元素总和,这就是答案...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。