在 Python 中返回斐波那契数列中的整数
Returning an integer number in the Fibonacci Series in Python
我正在尝试构建一个函数,它将取 n 和 return 斐波那契数列中的第 n 个整数。
例如:
斐波那契数列:
1, 1, 2, 3, 5, 8, 13, 21, .....
如果函数是 Fibonacci,那么它将 return: 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
不 return 值
- 使用小写字母和下划线分隔单词的函数名
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-th 数字(而不是迭代过去的值):
import math
SQRT_5 = math.sqrt(5)
def fibonacci(n):
return int(((((1 + SQRT_5) / 2) ** n) / SQRT_5) + 0.5 )
在“与黄金比例的关系”中阅读有关 Wikipedia 的更多信息。
是因为到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, b = b, a+b
return a
附加到列表对于斐波那契数的实现没有意义;您只需要存储最后两个数字,因为所有之前的数字都不再计算在内:
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
这可以说是 Python 中本系列的“规范”实现。
您实施中的具体问题是您的列表最初是空的,并且没有为 i<2 填充。因此,一旦您的循环到达 i=2,您将尝试访问列表中不存在的两个元素。
IndexError
以及如何跟踪错误
IndexError
只能通过尝试访问列表中的项目来触发;这只发生在代码中的 n=ls.append(ls[i-1]+ls[i-2])
行。
为了帮助调试,您可以在该行之前添加一个 print
语句,并打印 i
和 ls
,这样您就可以在程序崩溃时知道变量的值.
错误以及如何修正
在这种情况下,答案很简单:您的列表 ls
一开始是空的,您在向列表添加任何元素之前尝试访问 ls[i-1] and ls[i-2]
。
我建议使用 [0, 1]
初始化列表,因为它们是前两个斐波那契值,并且是您在当前代码中从未附加到列表中的唯一值。
第二个错误和最后更正的代码
此外,ls.append(...)
向 ls
添加了一个元素,但没有 return 值,因此在添加值之后,您应该将其存储在 n
中多了一行 n = ls[-1]
。请注意,在 python 中,“位置 -1
中的元素”只是位置 len(ls) - 1
中元素的 shorthand, 即 , 列表中的最后一个元素。
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
。您可能认为这是个人喜好,但编程语言有时具有 well-established 约定和风格习惯。我建议用小写字母命名变量和函数。为 class 名称和例外保留大写字母。
进一步改进您的代码
计算 Fibonacci(a)
时,您需要的值只有 Fibonacci(a-1)
和 Fibonacci(a-2)
。不需要将整个先前值列表保存在内存中;您需要保留的只是前两个值。尝试编写一个新的 Fibonacci 函数,其逻辑与以前相同,但只在内存中保留两个值而不是整个列表!
其他人已经指出了如何修复您的代码,但我想从绘图板开始。斐波那契问题是掌握 递归 的一种非常好的方法 - 如果您还没有这样做的话。这里的递归函数将比循环列表更易读并且可能更快。
Python 网上有数百种斐波那契问题的有效解决方案,例如here.
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 个元素的总和。
然后我们打印了新的 last 2. and 3. elements sum 这就是答案...
我正在尝试构建一个函数,它将取 n 和 return 斐波那契数列中的第 n 个整数。 例如: 斐波那契数列:
1, 1, 2, 3, 5, 8, 13, 21, .....
如果函数是 Fibonacci,那么它将 return: 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
不 return 值- 使用小写字母和下划线分隔单词的函数名
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-th 数字(而不是迭代过去的值):
import math
SQRT_5 = math.sqrt(5)
def fibonacci(n):
return int(((((1 + SQRT_5) / 2) ** n) / SQRT_5) + 0.5 )
在“与黄金比例的关系”中阅读有关 Wikipedia 的更多信息。
是因为到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, b = b, a+b
return a
附加到列表对于斐波那契数的实现没有意义;您只需要存储最后两个数字,因为所有之前的数字都不再计算在内:
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
这可以说是 Python 中本系列的“规范”实现。
您实施中的具体问题是您的列表最初是空的,并且没有为 i<2 填充。因此,一旦您的循环到达 i=2,您将尝试访问列表中不存在的两个元素。
IndexError
以及如何跟踪错误
IndexError
只能通过尝试访问列表中的项目来触发;这只发生在代码中的 n=ls.append(ls[i-1]+ls[i-2])
行。
为了帮助调试,您可以在该行之前添加一个 print
语句,并打印 i
和 ls
,这样您就可以在程序崩溃时知道变量的值.
错误以及如何修正
在这种情况下,答案很简单:您的列表 ls
一开始是空的,您在向列表添加任何元素之前尝试访问 ls[i-1] and ls[i-2]
。
我建议使用 [0, 1]
初始化列表,因为它们是前两个斐波那契值,并且是您在当前代码中从未附加到列表中的唯一值。
第二个错误和最后更正的代码
此外,ls.append(...)
向 ls
添加了一个元素,但没有 return 值,因此在添加值之后,您应该将其存储在 n
中多了一行 n = ls[-1]
。请注意,在 python 中,“位置 -1
中的元素”只是位置 len(ls) - 1
中元素的 shorthand, 即 , 列表中的最后一个元素。
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
。您可能认为这是个人喜好,但编程语言有时具有 well-established 约定和风格习惯。我建议用小写字母命名变量和函数。为 class 名称和例外保留大写字母。
进一步改进您的代码
计算 Fibonacci(a)
时,您需要的值只有 Fibonacci(a-1)
和 Fibonacci(a-2)
。不需要将整个先前值列表保存在内存中;您需要保留的只是前两个值。尝试编写一个新的 Fibonacci 函数,其逻辑与以前相同,但只在内存中保留两个值而不是整个列表!
其他人已经指出了如何修复您的代码,但我想从绘图板开始。斐波那契问题是掌握 递归 的一种非常好的方法 - 如果您还没有这样做的话。这里的递归函数将比循环列表更易读并且可能更快。
Python 网上有数百种斐波那契问题的有效解决方案,例如here.
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 个元素的总和。 然后我们打印了新的 last 2. and 3. elements sum 这就是答案...