剑指offer面试题10:求斐波那契数列的第n项

索引请参考:系列目录
题目:

  • 写一个函数,输入n,求斐波那契额数列的第n项。
  • 斐波那契额数列的定义如下:
    在这里插入图片描述

分析:

  • 利用上述公式计算第n项斐波那契项可以实现,但是由于递归造成的时间可空间消耗很大。思路(2)对该算法进行了修改,使得不断地递归变成了有限项的迭代,大大减少了时间的消耗和空间消耗。

思路:
(1)按照上述公式实现该算法:
(2)其实斐波那契数列从第二项开始的规律是第n项等于前两项的和。

  • 方法:把已经得到的数列中间项保存起来。具体实现见代码。

方法(1):

int fibonaccic(const int n) {

	if (n == 0)
		return 0;
	else if (n == 1)
		return 1;
	else
		return fibonaccic(n - 1) + fibonaccic(n - 2);

}

牛客运行结果:
在这里插入图片描述
方法(2)

int result[2] = { 0,1 };
	if (n < 2)
		return result[n];
	int Fn, Fn_1 = 1, Fn_2 = 0;//一开始的前两项为0 1
	for (int i = 2; i <= n; ++i)
	{
		Fn = Fn_1 + Fn_2;
		Fn_2 = Fn_1;
		Fn_1 = Fn;
	}
	return Fn;

牛客运行结果:
在这里插入图片描述
评注:
通过两种方法可以看出,方法(1)在时间效率上大大提高了,其中表层的原因是将算法中的大量迭代转变成了有限项的迭代。深层的原因是有关于函数调用的过程,其中涉及到了临时变量、返回结果的压栈、出栈以及函数传参过程中拷贝所涉及的时间消耗等。其中,算法所占用的内存也有所改善。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【问题描述】 【问题描述】编写函数f,功能是用递归的方法斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值