【算法详解】斐波那契数列 - Fibonacci sequence

1. 斐波那契数列定义



在线测试工具: http://zh.numberempire.com/fibonaccinumbers.php


2. 算法

求解斐波那契数列的第n个数:


2.1 递归/分治法

#include <cstring>
#include <iostream>

using namespace std;

unsigned long fabinacci(unsigned int n)
{
	if (n == 0)
	{
		return 0;
	}else
	if (n == 1)
	{
		return 1;
	}else
	{
		return fabinacci(n - 2) + fabinacci(n - 1);
	}
}

int main() 
{
	unsigned int n = 0;
	cout<<"Please input a unsigned integer:"<<endl;
	cin>>n;
	cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
	return 0;
}

递归效率分析:

以计算f(10)为例:


从图中可以看出:要计算很多重复的之,计算重复值的数量随着N值而急剧增大。事实上该算法的时间复杂度随着n值呈指数增长 O((3/2)^n)


2.2 迭代求解

循环求解:
#include <cstring>
#include <iostream>

using namespace std;

long long fabinacci(unsigned int n)
{
	if (n == 0)
	{
		return 0;
	}else
	if (n == 1)
	{
		return 1;
	}

	long long first = 0;
	long long second = 1;

	for (unsigned i = 1; i < n; i++)
	{
		second = first + second;
		first = second - first;
	}

	return second;
}

int main() 
{
	unsigned int n = 0;
	cout<<"Please input a unsigned integer:"<<endl;
	cin>>n;
	cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
	return 0;
}

时间复杂度为: O(n)

2.3 通向求解



2.4 矩阵乘法 / 分治策略

推导:


#include <cstring>
#include <iostream>

using namespace std;

void MatrixMulti(long long matrix[2][2],long long matrix2[2][2])
{
	long long a = matrix[0][0] * matrix2[0][0] +  matrix[0][1] * matrix2[1][0];
	long long b = matrix[0][0] * matrix2[0][1] +  matrix[0][1] * matrix2[1][1];
	long long c = matrix[1][0] * matrix2[0][0] +  matrix[1][1] * matrix2[1][0];
	long long d = matrix[1][0] * matrix2[0][1] +  matrix[1][1] * matrix2[1][1];
	matrix[0][0] = a;
	matrix[0][1] = b;
	matrix[1][0] = c;
	matrix[1][1] = d;
}

long long fabinacci(int value)
{
	if(value == 0)
	{
		return 0;
	}

	long long A[2][2] = {1,1,1,0};
	long long Matrix[2][2] = {1,0,1,0};

	int n = value - 1;

	for(; n ;n >>= 1)
	{
		//odd
		if(n&1)
		{
			MatrixMulti(Matrix,A);
		}
		MatrixMulti(A,A);
	}

	return Matrix[0][0];
}

int main() 
{
	unsigned int n = 0;
	cout<<"Please input a unsigned integer:"<<endl;
	cin>>n;
	cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
	return 0;
}

时间复杂度: O(log(N))










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值