递归与分治——斐波那契数列非递归,递归,与优化后的递归算法

斐波那契数列:

1、1、2、3、5、8、13、21、……

简单说,就是前两项的和是第三项的值。

1、求第N个斐波那契数的值(非递归)

//斐波那契数列
int fun(int n)
{
	int a = 1, b = 1, c = 1;
	for (int i = 3; i <= n; i++)
	{
		c = a + b;
		a = b;
		b = c;
	}
	return c;
}//O(n)   S(1)

2、求第N个斐波那契数的值(递归)

很简单,求第N个斐波那契数,我们需要求第n-1和n-2个斐波那契数,而求第n-1个斐波那契数,我们需要求第n-2和n-3个斐波那契数…以此类推,比如求第5个斐波那契数如图:
在这里插入图片描述
递归出口很显然,当n = 1或者2时,fib(n) = 1,所以递归出口便是n <= 2 return 1;

int fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);
}//O(2^n)  S(n)

在这里插入图片描述

此递归算法时间复杂度为O(2^n) ,空间复杂度为S(n)。由上图可见时间复杂度高是因为f(n)的值被多次计算,那怎么将递归的O(2^n)改成O(n)?
可见,当我们使f(n)只被计算一次,那么时间复杂度自然降为O(n)
3、优化后的斐波那契数列递归算法
尾递归法:通过两个变量保存计算值,传递给下一次进行计算,递归的过程中也是根据n值变化逐步重复运算。

//怎么将递归的O(2^n)改成O(n)?
int fib(int n, int a, int b)
{
	if (n <= 2)
	{
		return b;
	}
	else
	{
		return fib(n-1, b, a+b);
	}
}

int fib(int n)
{
	int a = 1, b = 1;
	return fib(n, a, b);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟小胖_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值