斐波拉契数列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, 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写法相关推荐
- 【斐波拉契数列】 Python
[斐波拉契数列:这个数列从第三项开始,每一项都等于前两项之和] 题目内容:已知斐波拉契数列的前两项都是1, 我们定义求斐波拉契数列的第n项(n<=50)的函数为fbnq,程序主体如下:n=int ...
- Python输出斐波拉契数列
斐波拉契数列 1.什么是斐波拉契数列 2.用Python代码输入数列前30项 遇到问题不要迷茫,多思考,多问,这样你才能越发优秀 1.什么是斐波拉契数列 斐波那契数列(Fibonacci sequen ...
- 递归与递推 输出斐波拉契数列的前n项 python
输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...
- Python 探讨斐波拉契数列模素数的周期问题
Python 探讨斐波拉契数列模素数的周期问题之目录 前言 一.生成斐波拉契数列 二.创建素数列表 三.搜索周期数列的循环节 3.1 斐波拉契数列模 p p p 的周期 3.2 循环节的搜寻代码 3. ...
- [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 ...
- Python案例:格式化输出斐波拉契数列
文章目录 一.提出任务 二.运行效果 三.实现步骤 1.定义fib(n)函数 2.采用format()函数实现格式化输出 3.采用repr()与rjust()函数实现格式化输出 4.运行程序,查看效果 ...
- Python程序-打印斐波拉契数列
这个程序的输出从第0项开始,输出到指定的项为止. 程序如下: # 打印斐波拉契数列 iterations = int(input("Number of iterations: ") ...
- python打印斐波拉契数列
什么是斐波拉契数列? 斐波那契数列指的是这样一个数列" 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597, ...
- 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' # ...
最新文章
- VMware下redhat9.0的上网设置
- MySoft.Data入门篇:实体生成
- ***S 2012 交互式报表 -- 钻取式报表
- leetcode 61 python
- Visual C# 2008+SQL Server 2005 数据库与网络开发-- 9.1 对XML的支持
- Web后端学习笔记 Flask (5) 数据库
- teechart for java_TeeChart java控件
- 图像特征提取(二)——SIFT算法详解
- NVIDIA英伟达GPU显卡算力一览(包含Tesla和GeForce、TITAN及RTX系列等)
- 洛谷p1330 封锁阳光大学-二分图染色
- 新型冠状病毒SIR预测模型,MATLAB代码
- 论文翻译——Skin Lesion Synthesis with Generative Adversarial Networks
- 灵性图书馆:好书推荐-《当下的力量》
- VINS-Mono 代码详细解读——回环检测与重定位、四自由度位姿图优化
- WebGL技术学习之路
- ubuntu系统怎么退出tty模式(开机自动进入)?(仅供参考)
- 情殇之《秋窗风雨夕》
- hdu 4696 Answers
- 机器学习中的距离公式
- DELL服务器部件型号/PN查找