[算法学习]斐波那契数的计算
决定开始看algorithms,而且尽量多思考,多写点代码。第一个碰到的算法就很具有启发性,一些看似正确的算法,实际的复杂度却很高。我们直接看问题:
问题:假设fibonacci(0)=0,fibonacci(1)=1,如果计算fibonacci(n)
解决方案一:直接利用斐波那契数的性质用递归计算
2 if n == 0:
3 return 0
4 elif n == 1:
5 return 1
6 else:
7 return fibonacci1(n-1)+fibonacci1(n-2)
一看好像这样做没什么不妥,但是你如果跑下fibonacci1(50)机器就开始忙碌了,仔细想想,这个算法的复杂度其实是O(2n),看看原书上的图就明白了
其中重复的计算很多,最后需要计算的次数是20.694n +3n次,这个明显是不行的,当n较大时,什么电脑都要跑上很久很久
解决方案二:不用递归,直接用循环计算
2 fib=[0, 1]
3 for i in range(2,n+1):
4 fib.append(fib[i-1]+fib[i-2])
5 return fib[n]
这种做法也比较直观,很明显这种方法的复杂度是O(n)。一般来说,你肯定会觉得这样就够了,实际上还有logn复杂度的方法。
解决方案三:用矩阵计算
斐波那契数的性质可以用矩阵来表示:,那么有。我们用X来表示其中的0111矩阵,那么对于Fn,我们只要计算Xn
就可以得到Fn。当然我们不能用循环来计算Xn ,而是用“折半法“通过Xn/2 *Xn/2计算。
2 return recuCal(n)[1]
3
4 matrix=[0,1,1,1]
5 def recuCal(n):
6 if n == 1:
7 return matrix
8 elif n == 2:
9 return matrixCal(matrix,matrix)
10 elif n % 2:
11 return matrixCal(matrixCal(recuCal(n/2),recuCal(n/2)),matrix)
12 else:
13 return matrixCal(recuCal(n/2),recuCal(n/2))
14
15 def matrixCal(matrix1,matrix2):
16 matrix3 = [0,0,0,0]
17 matrix3[0]=matrix1[0]*matrix2[0]+matrix1[1]*matrix2[2]
18 matrix3[1]=matrix1[0]*matrix2[1]+matrix1[1]*matrix2[3]
19 matrix3[2]=matrix1[2]*matrix2[0]+matrix1[3]*matrix2[2]
20 matrix3[3]=matrix1[2]*matrix2[1]+matrix1[3]*matrix2[3]
21 return matrix3
算法比较简单,matrixCal是计算两个矩阵的方法。recuCal是实现“折半法”的函数,返回计算结果矩阵,而这个矩阵的第2个数就是需要的结果。
以上代码都是用python写的,可以再写一个main来验证结果:
2 print fibonacci1(50)
3 print fibonacci2(50)
4 print fibonacci3(50)
当然fibonacci1(50)短时间跑不完的。最好还是把n定小点。
写完咯,睡觉
转载于:https://www.cnblogs.com/kakafei/archive/2009/12/04/1616576.html
[算法学习]斐波那契数的计算相关推荐
- 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
学习内容 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 具体内容 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 ...
- 在计算机科学中算法指的是,算法 - 为什么斐波纳契数在计算机科学中具有重要意义?...
算法 - 为什么斐波纳契数在计算机科学中具有重要意义? Fibonacci数字已经成为计算机科学学生递归的一个流行的介绍,并且有一个强烈的论据,他们坚持在自然界. 出于这些原因,我们很多人都熟悉它们. ...
- python计算第n个斐波那契数_计算第n个斐波那契数
方法一:传统递归法 时间复杂度O(2^n),空间复杂度O(n) 计算Fibonacci(10)十次平均用时0.0003s 计算Fibonacci(100)单次用时大于1min 时间复杂度极高,当 ...
- 动态规划学习之三种方法解决斐波拉契数
斐波拉契数是一个很经典的问题,也会很多公司面试的考题,每个学习计算机的同学都会接触这个问题,尤其是在学习递归的时候,利用递归来解决斐波拉契数是很多教材采用的一个例子,所以很多同学一想到斐波拉契马上就会 ...
- 算法笔记_001:斐波那契数的多种解法(Java)
本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...
- JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码)
JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码) fibonacciNthClosedForm.js完整源代码 fibonacci ...
- JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码)
JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码) fibonacciNth.js完整源代码 fibonacciNth.js完整源代码 export ...
- 算法----斐波那契数
題目 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F ...
- 算法实验1、用C/C++编写递归函数,计算斐波那契数(Fibonacci)Fn
我们设第n个斐波那契数为F(n),根据斐波那契数列的定义,有: 1)当n<=2,F(n)=1: 2)当n>2,F(n)=F(n-1)+F(n-2). 那么在我们进行递归编程的时候,可以: ...
最新文章
- mysql主从同步面试题_面试被问MySQL 主从复制,怎么破?
- apt-get install php5-redis,Ubuntu安装redis和php5-redis扩展
- 纽约出租车计费问题:数据清洗与初探
- JavaScript 实现模拟拖放
- linux 基础命令(三)
- 腾讯联手联通推出车联网“网卡”,打“内容”+“流量”的组合拳...
- Redis全面实战教程
- 二调ARCGIS符号库
- 无法登录 mysql 服务器_无法登录 MySQL服务器/无法开启 MySQL服务
- 整活小能手!Windows系统滑动关机!一行脚本实现炫酷效果
- mysql cleaned up_关于mysqld自动停止的问题
- CentOS7 分区合并
- Java将域名转换成IP
- 【报告分享】小红书平台2021 11.11期间行业投放分析报告-千瓜数据(附下载)
- HttpClient数据传输的编码方式
- 企业、商家、门店多行业线上线下电商小程序
- influxdb官网文档翻译
- DNA非编码区,外显子,内含子突变区别
- Moodle二次开发(1)-- 微创新
- 三年级计算机秒打汉字教案,武汉社版三年级全册信息技术 18.汉字输入我能行 教案...
热门文章
- 【2018年11月21日】煤炭行业的估值高度排名
- ThreadPoolExecutor的execute源码分析
- mysql在没有任何用户的情况下,如何恢复
- Checkstyle 简介 以及各版本下载地址
- 利用FluidMoveBehavior制作出手机通讯录平滑的效果
- git创建与管理远程分支
- Eclipse无法打开“Failed to load the JNI shared library”
- 微软社区精英计划 - 你会如何回答【6月26日】北京.Net学习活动QA时提出的问题...
- RM格式转换成VCD
- FetchAI Case Study