博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
斐波那契(Fibonacci)数列的七种实现方法
阅读量:6848 次
发布时间:2019-06-26

本文共 2270 字,大约阅读时间需要 7 分钟。

废话不多说,直接上代码

#include "stdio.h"#include "queue"#include "math.h"using namespace std;/////一:递归实现//	使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。///int fib1(int index)     {	if(index<1)	{		return -1;	}	if(index==1 || index==2)		return 1;	return fib1(index-1)+fib1(index-2);}/////二:数组实现//	空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。///int fib2(int index){	if(index<1)	{		return -1;	}	if(index<3)	{		return 1;	}	int *a=new int[index];	a[0]=a[1]=1;	for(int i=2;i
实现// 时间复杂度是0(n),空间复杂度是0(1),当然vector有自己的属性会占用资源。/int fib3(int index) { if(index<1) { return -1; } vector
a(2,1); //创建一个含有2个元素都为1的向量 a.reserve(3); for(int i=2;i
实现// 当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复杂度和vector
一样,但队列太适合这里了,// f(n)=f(n-1)+f(n-2),f(n)只和f(n-1)和f(n-2)有关,f(n)入队列后,f(n-2)就可以出队列了。///int fib4(int index) { if(index<1) { return -1; } queue
q; q.push(1); q.push(1); for(int i=2;i

七:矩阵乘法

最后一种方法不是一种实用的方法,也比较难以想到,其算法实现也比较复杂,在此单述。

我们将数列写成:

Fibonacci[0] = 0,Fibonacci[1] = 1

Fibonacci[n] = Fibonacci[n-1] + Fibonacci[n-2] (n >= 2)

可以将它写成矩阵乘法形式:

将右边连续的展开就得到:

下面就是要用O(log(n))的算法计算:

#include
struct Matrix2By2{ Matrix2By2 ( long long m00 = 0, long long m01 = 0, long long m10 = 0, long long m11 = 0 ) :m_00(m00), m_01(m01), m_10(m10), m_11(m11) { } long long m_00; long long m_01; long long m_10; long long m_11;};Matrix2By2 MatrixMultiply ( const Matrix2By2& matrix1, const Matrix2By2& matrix2 ){ return Matrix2By2( matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10, matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11, matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10, matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);}Matrix2By2 MatrixPower(unsigned int n){ Matrix2By2 matrix; if(n == 1) { matrix = Matrix2By2(1, 1, 1, 0); } else if(n % 2 == 0) { matrix = MatrixPower(n / 2); matrix = MatrixMultiply(matrix, matrix); } else if(n % 2 == 1) { matrix = MatrixPower((n - 1) / 2); matrix = MatrixMultiply(matrix, matrix); matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0)); } return matrix;}long long fib7(unsigned int n){ int result[2] = {0, 1}; if(n < 2) return result[n]; Matrix2By2 PowerNMinus2 = MatrixPower(n - 1); return PowerNMinus2.m_00;}//简单的测试int main(){ printf("%d\n",fib7(10)); return 0;}

转载于:https://www.cnblogs.com/hdk1993/p/4366534.html

你可能感兴趣的文章
java面试题 Web基础 BAT面试题系列 基础篇(十五)
查看>>
OS X 10.9 Mavericks下如何安装Command Line Tools(命令行工具)
查看>>
redis常用命令及结构
查看>>
Ubuntu下访问Windows中Postgresql
查看>>
mfc模态对话框
查看>>
DirectX 读书笔记(14) Cube mapping之SkyBox[转]
查看>>
移动端web开发初探之Vuejs的简单实战
查看>>
Team Project Proposal for ASE Course---query suggestion by 3D tag cloud
查看>>
IDEA2016.3搭建Struts2+Hibernate+Spring项目环境
查看>>
多线程(一)线程创建的三种方式
查看>>
HDU-4310 Hero 贪心Or动态规划
查看>>
linux软件管理 YUM命令
查看>>
windows下memcache安装及配置
查看>>
第一次作业人工智能
查看>>
labeled LDA,Hierarchically Supervised LDA
查看>>
JavaScript 捕获按键
查看>>
记录Javascript数组的方法参考
查看>>
截图软件
查看>>
关于抽奖概率的问题
查看>>
《鸟哥的私房菜阅读摘要》——linux的简介和计算机基础
查看>>