斐波那契数列的实用解法

定义:


斐波那契数列的解法有好多种,但是最常见的,也是最简单易懂的就是递归,然而动态规划也是可以解决这类问题。


解法一:递归

这种方法是最直观,也是最容易懂得的一种写法。但是这种方法存在着严重的效率问题。

long long fib(size_t x)
{
	if(n < =0)
	{
		return 0;;
	}
	if(n == 1)
	{
		return 1;
	}
	return fib(n-1)+fib(n-2);
}
简单分析一波,当我们想求得f(10),需要首先求的f(9)和f(8),同样的f(9)也是需要求的f(8)和f(7)...这种方法存在着很大的依赖关系,这就导致在计算过程中我们会重复计算很多的相同的值,并且这种重复的值会根据x的增大而成指数增长。

由于递归也有其本身的限制(由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能导致栈溢出),所以当求的x值比较大时也不易使用递归的思想。


改进版:

其实改进的方法并不难,递归的代码之所以比较慢是因为计算的重复相同的数值,只要想办法解决掉重复计算就ok了。当我们计算某个值时,我们可以从下到上的就算,根据f(0)和f(1)计算出f(2),在根据f(1)和f(2)计算出f(3)...以此类推。这种代码的复杂度为O(n)。

typedef long long  ty;

ty fib(unsigned x)
{
	int arr[2] = { 0,1 };
	if (x < 2)
	{
		return arr[x];
	}

	ty first = 0;
	ty second = 1;
	ty fibn = 0;

	for (unsigned i = 2; i < x; ++i)
	{
		fibn = first + second;
		first = second;
		second = fibn;
	}

	return fibn;
}








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值