1. 背景
背景:斐波那契数列(Fibonacci sequence),当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618,又称黄金分割数列。因数学家列昂纳多·斐波那契(Leonardoda Fibonacci )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……用公式定义如下:
2. 实现
2.1 递归方法实现(循环实现)
优点:代码简洁易懂
缺点:当fib数列长度n较大时,反复的出栈和压栈操作使得运行时间很长
思路:
- 在命令行,接收输入fib数列的长度n
- 使用for循环和range对象,迭代计算n长的fib数列值
- fib计算函数:当n=0时,返回fib(n)=0;当n=1和n=2时,返回fib(n)=1;当n>=3时,fib(n) = fib(n - 1) + fib(n - 2)
def fibonacci(n):
if n == 0: # 对于fib数列的第0号元素
return 0
elif n == 1: # 对于fib数列的第1号元素
return 1
else: # 对于fib数列的第n号(n>=2)元素
return fibonacci(n - 1) + fibonacci(n - 2)
x = int(input("输入待求fib数列的长度:"))
if x < 0:
print("输入错误,请输入一个正数!")
for i in range(x) : # range对象可iterable:range(start, end);range(length),从0开始
print(fibonacci(i)) # 输出数列中第0到第x号元素的值
2.2 列表实现
优点:当fib数列长度n较大时,求解速度较递归法快
思路:
- 在命令行,接收输入fib数列的长度x
- 初始化arr数组[0, 1, 1],存放fib数列任意相邻的3个元素
- 使用for循环和range对象,迭代计算x长的fib数列值
- 输出fib数列第i号元素;使用除法求余%,fib数列元素依次放在数组arr的索引i%3处
- 把arr数组看成一个循环链表:arr数组输出fib数列第i号元素后,对应arr索引(i%3)存放项数比fib数列第i号大3的元素,而这个值就是前一个arr数组的后两项元素相加
x = int(input("输入待求fib数列的长度:"))
if x < 0:
print("输入错误,请输入一个正数!")
arr = [0, 1, 1]
for i in range(0, x):
print(arr[i%3])
arr[i%3] = arr[(i+1)%3] + arr[(i+2)%3]
2.3 生成器实现
# 从for/while循环中,使用“yield var”取出每次循环后的变量值;多次调用next函数,可探看每次循环中某值的变化
def fib():
x, y = 0, 1
# 使用for i in range(num)计算指定数目的fib数列,num是fib()的位置参数
while True:
yield x
x, y = y, x + y
g1 = fib()
next(g1) # x = 0
next(g1) # x = 1
next(g1) # x = 1
next(g1) # x = 2
next(g1) # x = 3
next(g1) # x = 5
next(g1) # x = 8
next(g1) # x = 13