斐波那契(Fibonacci)数列问题

基本描述如下:F(0) = 0,F(1)=1,F(n)= F(n-1)+F(n-2),求F(n).

采用递归的方法就不说了,很简单。递归是自上往下,有大量重复计算,如果我们采用自下往上的迭代方式,则会省去大量不必要计算,时间复杂度为O(n),代码如下:

int fibonacci(int n)
{	int FFirst = 1;
	int FLast = 0;
	int Sum = 0;
	for (int i = 2;i<=n;i++)
	{
		Sum = FFirst+FLast;
		FLast = FFirst;
		FFirst = Sum;
	}
	return Sum;
}

网上看来第三种方法,时间复杂度是O(logn),详述如下:

由F(n) = F(n-1)+F(n-2)容易得到(F(n),F(n-1))= (F(n-1),F(n-2))*A,A = {1,1;1,0}继而推导出{f(n), f(n-1), f(n-1), f(n-2)} ={1, 1; 1,0}n-1   故求得A的n-1次方的矩阵,第一行第一列元素即为F(n),采用二分法来求解矩阵乘积:

        /  an/2*an/2                            n为偶数时
an=
        \  a(n-1)/2*a(n-1)/2 *a           n为奇数时

具体实现如下:

        首先定义一个类或者Struct:2*2的矩阵Matrix,再定义两个矩阵成绩函数:Matrix matrixMulity(const Matrix& M1,const Matrix& M2),返回一个2*2的矩阵,具体代码不写了。然后是具体函数实现如下:

Matrix MatrixPower(unsigned int n)
{
	Matrix matrix;
	if(n == 1)
	{
		matrix = Matrix(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, Matrix(1, 1, 1, 0));
	}

	return matrix;
}
long fibonacci(unsigned int n)
{
	assert(n>=0);
	const int F0 = 0;
	const int F1 = 1;

	if (n==1)
		return F1;
	if (n ==0)
		return F0;

	Matrix PowerNMinus2 = MatrixPower(n - 1);
	return PowerNMinus2.M00;//这是矩阵的第一列第一行的元素
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值