文章目录

  • 第一种:递推方法
  • 第二种:递归方式
  • 第三种:用一个类写出比较全面的斐波拉契

斐波那契数列(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, 1for _ in range(n):  # 这里for遍历的时候元素不重要也不需要,所以写的_a, b = b, a + breturn 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 fibraise IndexError('Index out of range')
IndexError: Index out of rangeProcess finished with exit code 1
  • while循环
def fib(n):if n < 0:raise IndexError('Index out of range')a, b = 0, 1while n > 0:a, b = b, a + bn -= 1return a

功能测试与for的测试一致

第二种:递归方式

def fib(n):if n < 0:raise IndexError('Index out of range')elif n == 0:return 0elif n < 3:return 1return 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.itemsdef __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 rangeProcess finished with exit code 1

斐波拉契数列python写法相关推荐

  1. 【斐波拉契数列】 Python

    [斐波拉契数列:这个数列从第三项开始,每一项都等于前两项之和] 题目内容:已知斐波拉契数列的前两项都是1, 我们定义求斐波拉契数列的第n项(n<=50)的函数为fbnq,程序主体如下:n=int ...

  2. Python输出斐波拉契数列

    斐波拉契数列 1.什么是斐波拉契数列 2.用Python代码输入数列前30项 遇到问题不要迷茫,多思考,多问,这样你才能越发优秀 1.什么是斐波拉契数列 斐波那契数列(Fibonacci sequen ...

  3. 递归与递推 输出斐波拉契数列的前n项 python

    输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...

  4. Python 探讨斐波拉契数列模素数的周期问题

    Python 探讨斐波拉契数列模素数的周期问题之目录 前言 一.生成斐波拉契数列 二.创建素数列表 三.搜索周期数列的循环节 3.1 斐波拉契数列模 p p p 的周期 3.2 循环节的搜寻代码 3. ...

  5. [python]练习之递归和循环实现斐波拉契数列

    1 # 程序功能:用递归和循环实现斐波拉契数列 2 # 0 1 1 2 3 5 8 13 21 34 3 4 def digui_fibo(number): 5 if number == 1: 6 r ...

  6. Python案例:格式化输出斐波拉契数列

    文章目录 一.提出任务 二.运行效果 三.实现步骤 1.定义fib(n)函数 2.采用format()函数实现格式化输出 3.采用repr()与rjust()函数实现格式化输出 4.运行程序,查看效果 ...

  7. Python程序-打印斐波拉契数列

    这个程序的输出从第0项开始,输出到指定的项为止. 程序如下: # 打印斐波拉契数列 iterations = int(input("Number of iterations: ") ...

  8. python打印斐波拉契数列

    什么是斐波拉契数列? 斐波那契数列指的是这样一个数列" 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597, ...

  9. python斐波拉契数列(Fibonacci)

    ##斐波拉契数列(Fibonacci) def Fibonacci(m):n,a,b=0,0,1 while n<m:print(b)a,b=b,a+bn +=1 return 'Done' # ...

最新文章

  1. VMware下redhat9.0的上网设置
  2. MySoft.Data入门篇:实体生成
  3. ***S 2012 交互式报表 -- 钻取式报表
  4. leetcode 61 python
  5. Visual C# 2008+SQL Server 2005 数据库与网络开发-- 9.1 对XML的支持
  6. Web后端学习笔记 Flask (5) 数据库
  7. teechart for java_TeeChart java控件
  8. 图像特征提取(二)——SIFT算法详解
  9. NVIDIA英伟达GPU显卡算力一览(包含Tesla和GeForce、TITAN及RTX系列等)
  10. 洛谷p1330 封锁阳光大学-二分图染色
  11. 新型冠状病毒SIR预测模型,MATLAB代码
  12. 论文翻译——Skin Lesion Synthesis with Generative Adversarial Networks
  13. 灵性图书馆:好书推荐-《当下的力量》
  14. VINS-Mono 代码详细解读——回环检测与重定位、四自由度位姿图优化
  15. WebGL技术学习之路
  16. ubuntu系统怎么退出tty模式(开机自动进入)?(仅供参考)
  17. 情殇之《秋窗风雨夕》
  18. hdu 4696 Answers
  19. 机器学习中的距离公式
  20. DELL服务器部件型号/PN查找

热门文章

  1. java实现如何定时给微信群中发送消息
  2. 使用弥散MRI构建连接体:Why,How和But
  3. 跳跃游戏 Jump Game 分析与整理
  4. PASA 全球aleo节点教程(pasa+aleo社区分享)
  5. 远程计算机或设备将不接受连接,IE无法上网
  6. 洲际酒店集团加速布局粤港澳大湾区,与华侨城酒店集团达成合作
  7. MySQL-用户管理
  8. 大连创业圈:孤独与寂寞并存
  9. 036卫星轨道及卫星在轨运动
  10. Pareto Chart