高效的斐波那契数列实现

一般斐波那契数列在教科书中都是以递归的形式登场的,所以一般有常规思维是用递归解决。

long long Fibonacci(unsigned int n)//递归实现
{
	if (n <= 0)
		return 0;

	if (1 == n)
		return 1;

	return Fibonacci(n - 1, n - 2);
}

但递归的效率实际是很低的,在计算数列中,有大量的重复性计算。以这种方式计算的时间复杂度是以指数递增的,。


实用的高效解法,利用循环来解出。复杂度为O(n)。

long long Fibonacci(unsigned int n)
{
	int result[2] = { 0, 1 };//将首两项先储存起来

	if (n < 2)
		return result[n];

	long long fibMinus1 = 1;
	long long fibMinus2 = 0;

	for (unsigned int 2; i <= n; i++)
	{
		fibN = fibMinus1 + fibMinus2;
		fibMinus2 = fibMinus1;
		fibMinus1 = fibN;
	}
	return fibN;
}

更加高效的O(logn)算法,但并不算实用。

就是满足一个归纳的等式。

[ f(n) f(n-1)     [ 1   1

  f(n-1)    f(n-2) ]=   1   0 ] ^n-1


斐波那契数列的常用变形,青蛙跳台阶和用格子覆盖矩形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值