斐波拉契数列python写法

简介: 斐波拉契数列python写法

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

第一种:递推方法

递推法,就是递增法,时间复杂度是 O(n),呈线性增长,如果数据量巨大,速度会越拖越慢

  • for循环
def fib(n):
    if n < 0:
        raise IndexError('Index out of range')
    a, b = 0, 1
    for _ in range(n):  # 这里for遍历的时候元素不重要也不需要,所以写的_
        a, b = b, a + b
    return a

测试是否实现基本功能

for i in range(9):
    print(fib(i),end='\t')
C:\Users\zhuzhupoo\AppData\Local\Programs\Python\Python39\python.exe "D:/PyCharm 2021.3.3/py/feibolaqie.py"
0 1 1 2 3 5 8 13  21  
Process finished with exit code 0
print(fib(-1))
C:\Users\zhuzhupoo\AppData\Local\Programs\Python\Python39\python.exe "D:/PyCharm 2021.3.3/py/feibolaqie.py"
Traceback (most recent call last):
  File "D:\PyCharm 2021.3.3\py\feibolaqie.py", line 29, in <module>
    print(fib(-1))
  File "D:\PyCharm 2021.3.3\py\feibolaqie.py", line 12, in fib
    raise IndexError('Index out of range')
IndexError: Index out of range
Process finished with exit code 1
  • while循环
def fib(n):
    if n < 0:
        raise IndexError('Index out of range')
    a, b = 0, 1
    while n > 0:
        a, b = b, a + b
        n -= 1
    return a

功能测试与for的测试一致

第二种:递归方式

def fib(n):
    if n < 0:
        raise IndexError('Index out of range')
    elif n == 0:
        return 0
    elif n < 3:
        return 1
    return fib(n-1) + fib(n-2)

这种方法最简洁,甚至可以转化为单行代码,但是效率最低,会出现大量的重复计算

def fib(n): return 1 if  n < 3 else fib(n-1) + fib(n-2)

由于有大量重复计算,我们可以稍微优化一下,设置一下缓存

from functools import lru_cache
@lru_cache
def fib(n): 
  return 1 if  n < 3 else fib(n-1) + fib(n-2)

第三种:用一个类写出比较全面的斐波拉契

class Fib:
    """一个方便调用的斐波拉契数列"""
    def __init__(self):
        self.items = [0, 1, 1]  # 定义斐波拉契数列前3项(0,1,2)
    def __str__(self):  # 提供可视化输出
        return str(self.items)
    # def __repr__(self):
    #     return self.__str__()
    __repr__ = __str__  # 提供不同情况下的可视化输出,简化上面的代码
    def __len__(self):  # 提供长度方法
        return len(self.items)  # 取列表的长度
    def __iter__(self):
        # return iter(self.items) # 转化为一个生成器,与下面一行代码同功能
        yield from self.items
    def __getitem__(self, index):   # 提供索引方法
        if index < 0:
            raise IndexError('Index out of range')  # 索引为负数抛出异常
        for i in range(len(self), index+1):         # 计算列表中不包含的项
            self.items.append(self.items[i-1] + self.items[i-2])
        return self.items[index]
    # def __call__(self, index):
    #     return self.__getitem__(index)    # 提供实例调用方法,与下面一行代码功能一致,实际上都是将call丢给getitem处理
    #     return self[index]
    __call__ = __getitem__      # 简化上面的代码

测试是否实现基本功能

f = Fib() # 实例化
print(f)  # 观察可视化是否实现
print(f[0], f[1], f[3],end='\t')  # 观察能否使用实例索引
print(f(0), f(1), f(5),end='\t')  # 观察实例能否调用
for i in range(9):
    print(f(i),end='\t')
for x in f:             # 打印列表中现有的项
    print(x,end='\t')
print(f)
C:\Users\zhuzhupoo\AppData\Local\Programs\Python\Python39\python.exe "D:/PyCharm 2021.3.3/py/fib0130.py"
[0, 1, 1]
0 1 2 0 1 5 0 1 1 2 3 5 8 13  21  0 1 1 2 3 5 8 13  21  [0, 1, 1, 2, 3, 5, 8, 13, 21]
Process finished with exit code 0
print(f[-1])
C:\Users\zhuzhupoo\AppData\Local\Programs\Python\Python39\python.exe "D:/PyCharm 2021.3.3/py/fib0130.py"
Traceback (most recent call last):
  File "D:\PyCharm 2021.3.3\py\fib0130.py", line 36, in <module>
    print(f[-1])
  File "D:\PyCharm 2021.3.3\py\fib0130.py", line 21, in __getitem__
    raise IndexError('Index out of range')  # 索引为负数抛出异常
IndexError: Index out of range
Process finished with exit code 1


目录
相关文章
|
7月前
|
存储 Python
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
52 0
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
|
7月前
|
Python
python编写一个数组排序
python编写一个数组排序
64 8
|
Python
【从零学习python 】07.Python运算符详解:赋值、比较和逻辑运算符
【从零学习python 】07.Python运算符详解:赋值、比较和逻辑运算符
95 0
|
存储 C++ Python
【Python编程】三、Python变量与运算符
【Python编程】三、Python变量与运算符
145 0
【Python编程】三、Python变量与运算符
|
C语言 索引 Python
Python条件语句和循环语句简单使用方法
Python条件语句和循环语句简单使用方法
160 0
Python条件语句和循环语句简单使用方法
|
Python
Python基础语法(python函数)python函数的各种使用方法
python函数 函数时执行特定任务和完成特定功能的一段代码,如print、input等函数 函数的作用: 1、复用代码 2、隐藏实现细节 3、提高可维护性 4、提高可读性便于调试 函数的创建: def 函数名(输入参数): 函数体 return xxx return语句 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。 函数的参数传递: 函数调用的参数传递 位置实参: 根据形参对应的位置进行实参传递.
Python基础语法(python函数)python函数的各种使用方法
|
机器学习/深度学习
|
Python
python常见的运算符及用法
💖python中的运算符主要包括算术运算符,关系(比较)运算符,赋值运算符,逻辑运算符,成员运算符,身份运算符,三目运算符。使用运算符将不同类型的数据按照一定的规则连接起来的式子,称为表达式。下面将介绍一些常用的运算符💖
228 0
python常见的运算符及用法
|
Python
python divmod函数的使用和限制字符的写法
python divmod函数的使用和限制字符的写法
113 0
|
缓存 测试技术 Python
Python中装饰器的写法大全
Python中装饰器的写法大全
124 0