python实现经典算法(2):Fibonacci(斐波那契)数列

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值