python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)

最近在查阅斐波那契数列时,看到下面的文章,总结得非常好,于是自己上手使用 Python 练习并实现多种求解方法

守望:面试官问你斐波那契数列的时候不要高兴得太早​zhuanlan.zhihu.com

斐波那契数列的定义:

斐波那契数列 又称黄金分割数列,指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 这个数列从第3项开始,每一项都等于前两项之和

根据定义递归求解

已知:Fib(0) = 0,Fib(1) = 1
Fib(n) = Fib(n-1) + Fib(n-2)

# 根据定义递归求解
def Fib_definition(n):# 检查输入if check_input(n):if (n <= 1): return nreturn Fib_definition(n - 1) + Fib_definition(n - 2)# 默认返回值else:return -1

递归求解,避免重复计算已经出现过的元素

我们都知道,根据定义递归求解,会存在大量的重复计算,于是我们将已经计算过的值保存在数组里,这样在后续需要计算时可以直接使用已经计算过的值,避免重复计算

# 递归求解,避免重复计算已经出现过的元素
def Fib_definition_notRepeat(n, fib_arr = [0, 1]):if check_input(n):# 检查输入if n < 2: return fib_arr[n]else:# 填充数组for x in range(n):fib_arr.append(-1)# 当求得 fib_arr[n-1] 时,fib_arr[n-2] 已知fib_arr[n] = Fib_definition_notRepeat(n-1, fib_arr) + fib_arr[n-2]return fib_arr[n]else:# 默认返回值return -1

递推求解,从已知元素递推所求元素

根据定义递归求解,我们是根据需要求得的元素一步一步倒推,直到倒推到我们已知的元素 ( 第 0 个,第 1 个 ),属于“反向”计算,那如果“正向”计算,从已知元素递推所求元素呢?

# 递推求解,从已知元素递推所求元素
def Fib_recurrence(n):# 检查输入if check_input(n):if n < 2:return nelse:index = 2fib_index_pre_pre = 0fib_index_pre = 1fib_index = 0while n >= index:fib_index = fib_index_pre_pre + fib_index_prefib_index_pre_pre = fib_index_prefib_index_pre = fib_indexindex += 1return fib_indexelse:# 默认返回值return -1

递推求解,把已求得的元素放入数组中

def Fib_recurrence_arr(n):# 检查输入if check_input(n):if n < 2: return nelse:index = 2fib_arr = [0, 1]while n >= index:fib_arr.append(fib_arr[index-1] + fib_arr[index-2])index += 1return fib_arr[len(fib_arr)-1]else:# 默认返回值return -1

尾递归求解

如果不是很理解尾递归,请参见

什么是尾递归?​www.zhihu.com
# 尾递归求解
def Fib_tail_recursion(n, index, fib_pre_pre, fib_pre):# 检查输入if check_input(n):if n < 2: return nelse:if n >= index:fib_index = fib_pre_pre + fib_prefib_pre_pre = fib_prefib_pre = fib_indexindex += 1return Fib_tail_recursion(n, index, fib_pre_pre, fib_pre)else: return fib_preelse:# 默认返回值return -1

利用矩阵求解,所求元素为

中的 A[0][0], 或
中的 A[0][1]

由于以下式子变形后满足定义

3a18c21dc74889c2e5edfa03a47acdc4.png
# 两个n阶矩阵相乘
def matrix_multiplication(n, A, B):C = []for line in range(n):line_arr = []for column in range(n):item = 0for i in range(n):item += A[line][i] * B[column][i]line_arr.append(item)C.append(line_arr)return C# 矩阵求解,所求元素为A^{n-1} 中的 A[0][0], 或 A^n 中的 A[0][1]
def Fib_matrix(n):if check_input(n):# 检查输入if n < 2: return nA = [[1, 1], [1, 0]]result = [[1, 0], [0, 1]]matrix_n = 2while n > 0:result = matrix_multiplication(matrix_n, result, A)n -= 1return result[0][1]else:# 默认返回值return -1

矩阵快速幂求解,所求元素为

中的 A[0][0], 或
中的 A[0][1]

利用快速幂算法缩短计算次数

# 两个n阶矩阵相乘
def matrix_multiplication(n, A, B):C = []for line in range(n):line_arr = []for column in range(n):item = 0for i in range(n):item += A[line][i] * B[column][i]line_arr.append(item)C.append(line_arr)return C# 矩阵快速幂求解,所求元素为A^{n-1} 中的 A[0][0], 或 A^n 中的 A[0][1]
def Fib_matrix_power(n):# 检查输入if check_input(n):if n < 2: return nA = [[1, 1], [1, 0]]result = [[1, 0], [0, 1]]matrix_n = 2while n > 0:# 判断最后一位是否为1,即可知奇偶if n & 1:result = matrix_multiplication(matrix_n, result, A)A = matrix_multiplication(matrix_n, A, A)n //= 2# n = n >> 1return result[0][1]else:# 默认返回值return -1

通项公式求解

97405c9b1d6c03526d948536d1b9397a.png

详细推导过程可参考:

斐波那契数列为什么那么重要,所有关于数学的书几乎都会提到?​www.zhihu.com
# 通项公式求解
import numpy
import math
def Fib_general_formula(n):denominator = math.sqrt(5)return int((numpy.power((1+denominator)/2, n) - numpy.power((1-denominator)/2, n)) / denominator)

利用Python生成器

因为这个不是所有语言都能够使用,所以我放在了最后

# 利用 Python 生成器求解
def Fib_python_generator(n):a, b = 0, 1while n > 0:a, b = b, a + bn -= 1yield a
# 获取生成器的最后一个元素
def get_python_generator_item(n):item = 0for i in Fib_python_generator(n):item = ireturn item

代码参考及下载

https://github.com/boxtsecond/Python-Practice/blob/master/FibonacciNumber.py​github.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[修复] Firemonkey 使用 DrawPath 断线问题(Android iOS 平台)

问题&#xff1a;使用 Canvas.DrawPath 绘制时&#xff0c;最后一点无法画到终点位置。&#xff08;这个问题要在粗线才能察觉&#xff09; 适用&#xff1a;Delphi 10 Seattle &#xff08;或更早的版本&#xff09; for Android & iOS 修复方法&#xff1a; 请将源码 FMX…

叠加卡片列表_使用PowerBI制作卡片图

如果要汇报重要的指标&#xff0c;比如超额完成的销售额、同比增长率等&#xff0c;不要把它埋没在图表里&#xff0c;用一个大大的数字自豪的展示它吧。卡片图&#xff0c;也被称为大数字磁贴&#xff0c;严格来说不能算是一种图表&#xff0c;只是仪表板的一个组件而已。在仪…

stringbuffer常用方法_第八讲:常用类库API

一、字符串操作---String类1、String可以表示一个字符串&#xff0c;不能被继承(最终类)不可变2、String类实际是使用字符数组存储的String类的两种赋值方式&#xff1a;(1)一种称为直接赋值、Java推荐使用第一种方式String name"小白"(2)通过关键字new调用String的构…

对应版本_Office 开发版本号与版本对应关系

Office从开发至今经历了非常多的版本&#xff0c;如office2000、office2003、office2007、office2010,office 2016到2019等等&#xff0c;那么大家知道吗&#xff1f;其实office还有开发版本号&#xff0c;可能很多用户不太熟悉&#xff0c;其实你打开office安装目录就可以明白…

python的def语句_【零基础学Python】def语句,参数和None值

像之前的print()、input()和len()功能&#xff0c;Python提供了一些类似的内置函数&#xff0c;另外也可以自己编写自定义函数。 示例&#xff1a; def hello(): print(Howdy!) print(Howdy!!!) print(Hello there.) hello() 第一行是def语句&#xff0c;它定义了一个名为hello…

筛选出一证多卡 用sql_对比Excel学习SQL(3):对列和行的操作

本文将从以下几个方面进行&#xff1a;一、对列的查询01 查询单个列03 查询所有列04 对列去重二、对列的值排序01 升序排列02 降序排列03 多个列排序三、对行的筛选01 单条件筛选02 多条件筛选03 IN命令04 LIKE命令正文&#xff1a;一、对列的查询Excel里对于一张表&#xff0c…

jude的一些基本用法

jude的基本使用方法 作为一名软件工程专业的学生&#xff0c;常常需要画各类流程图&#xff0c;数据流图。 说来惭愧&#xff0c;我对于各类图的画法以及各类画图软件并不熟悉。 需求工程老师给我们推荐过jude这个画图软件&#xff0c;但由于我不会使用&#xff0c;折腾了不少时…

python中reduce函数_Python中的reduce()函数

reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似&#xff0c;一个函数 f&#xff0c;一个list&#xff0c;但行为和 map()不同&#xff0c;reduce()传入的函数 f 必须接收两个参数&#xff0c;reduce()对list的每个元素反复调用函数f&#xff0…

oracle 存储过程中调用存储过程

create procedure sp_name() begin ……… end 比如&#xff1a; create procedure pro_showdbs() show datebase; end //用exec调用存储过程。 一个带参数的存储过程。SQL> CREATE OR REPLACE PROCEDURE HelloWorld1 (2 p_user_name VARCHAR23 ) AS4 BEGIN5 dbms_output.pu…

序列生成_PR Structured Ⅴ:GraphRNN——将图生成问题转化为序列生成

本文使用 Zhihu On VSCode 创作并发布Paper | Code本文一作实在是太大佬了&#xff0c;让我和小伙伴焦虑了好一阵子。作者主页送你们&#xff0c;将这份焦虑传递下去。Introduction图生成有很多用处&#xff1a;建模physical and social interactions发现新的化学和分子结构构建…

网络资产管理系统_固定资产管理系统网络版的各种语言翻译

固定资产管理系统网络版指的是固定资产管理系统项目的联网版本&#xff0c;适合需要远程操作及多人同时操作的用户&#xff0c;各个版本都提供相应的网络版。固定资产管理系统网络版系统稳定、功能强大&#xff0c;支持局域网内用户联网操作软件&#xff0c;适用于各机关企事业…

数据字典在sga的哪一个组件中缓存_非功能性约束之性能(1)-性能银弹:缓存...

在《什么是架构属性》一文中提到提高「性能」的主要方式是优化&#xff0c;而优化的其中一个主要手段就是添加缓存&#xff01;在软件工程里有这么一句话&#xff1a;「没有银弹」&#xff01;就是说由于软件工程的复杂性&#xff0c;没有任何一种技术或方法能解决所有问题&…

.NET的轻量级IOC框架芮双随笔

面向对象的设计的重用性一直是他的一个重要特性&#xff0c;为了有效定义这一特性&#xff0c;又引申出面向对象设计的几个原则&#xff1a;高内聚、低耦合、功能单一、优先使用聚合、面向接口编程等。依赖这些原则和前人的经验&#xff0c;又发展出形形色色的模式&#xff0c;…

python热部署_关于Spring Cloud 框架热部署的方法

1、在对应的pom.xml 文件中添加依赖org.springframework.bootspring-boot-devtoolstrue2、注&#xff1a;project 中添加 spring-boot-maven-plugin,主要在eclipse中使用&#xff0c;idea中不需要添加此配置。【IDEA 忽略这个步骤哦(⊙o⊙)&#xff1f;】org.springframework.b…

《世界是数字的》读后感

随着科技的发展&#xff0c;我们已经进入数字化的世界。十年前&#xff0c;我们还拿着小灵通、按键手机&#xff0c;十年后&#xff0c;我们每个人的手上都有一部触屏手机。科技的发展使得世上的东西都更新换代的很快&#xff0c;任何东西存在的时间都很短&#xff0c;瞬息间就…

html js css如何关联_会html+css+js就能把前端项目发布到多个平台

在这篇文章中&#xff0c;小编将给大家分享如何让自己的前端代码发布到多个常用的平台。看完这篇文章以后&#xff0c;你就知道了如何让你的前端代码发布到多个平台&#xff0c;如&#xff1a;安卓应用程序&#xff0c;小程序&#xff0c;iOS应用程序&#xff0c;Windows,Mac,L…

机器学习 监督学习论文_NeurIPS 2020最佳机器学习论文奖

NeurIPS 会议在提交的大量论文和1903年被接受的论文中&#xff0c;有3篇被授予。今年获奖的论文有&#xff1a;语言模型是学习者很少广义形式相关平衡的无悔学习动力学列子集选择和Nystrom方法的改进保证和多重下降曲线该NeurIPS委员会由一些指导准则。最好的论文必须具有革命性…

Java--File文件操作

判断文件或目录是否存在 判断File对象所指向的文件或者目录是否存在&#xff0c;使用exists()函数。 File f new File("/Users/bemaster/Desktop/in.txt"); System.out.println(f.exists()); 判断当前File对象是文件还是目录 判断当前File对象是否是文件&#xff0c…

iis 装完framework4 7 无法切换_扫盲贴之电压并列与电压切换

点击上方电气小青年&#xff0c;关注并星标由于微信改版&#xff0c;只有星标才能及时看到我们的消息哦━━━━━━推荐阅读&#xff1a;《国内电气顶尖高校的奖学金介绍&#xff0c;总奖学金接近150万&#xff01;》《世界工业自动化公司行业前十名&#xff1a;西门子、ABB、…

unixbench类似_UnixBench的实现介绍-阿里云开发者社区

很多用户都用UnixBench做性能测试&#xff0c;并做厂商之间的对比&#xff0c;那UnixBench到底做了哪些性能测试&#xff0c;本篇从代码层面阐述UnixBench做了哪些测试。在细说UnixBench的实现之前&#xff0c;先放一个总结果UnixBench算分介绍有类似结果&#xff0c;然后一个个…