剑指offer--斐波那契数列
记录来自《剑指offer》的算法题。
题目如下:
写一个函数,输入n,实现斐波那契数列的第n项。
斐波那契数列的定义如下:
f(n) = \begin{cases} 0 & n=0 \\ 1 & n=1 \\ f(n-1) + f(n-2) & n \gt 1 \end{cases}
教科书上通常在介绍递归的时候都会使用斐波那契数列作为例子,然后给出下列解法:
long long Fibonacci(unsigned int n){if(n<=0)return 0;if(n == 1)return 1;return Fibonacci(n-1) + Fibonacci(n-2);
}
但这个算法在n的增大后会变得很慢,主要原因是重复的计算比较多,改进算法如下所示:
// 改进版本
long long FibonacciOptimz(unsigned int n){int result[2] = { 0, 1 };if (n < 2)return result[n];long long fibNMinusOne = 1;long long fibNMinusTwo = 0;long long fibN = 0;for (unsigned int i = 2; i <= n; i++){fibN = fibNMinusOne + fibNMinusTwo;fibNMinusTwo = fibNMinusOne;fibNMinusOne = fibN;}return fibN;
}
// 测试
int main(void){int n = 10;cout << "use Fibonacci(), n = " << n << ", result = " << Fibonacci(n) << endl;cout << "use FibonacciOptimz(), n = " << n << ", result = " << FibonacciOptimz(n) << endl;cout << "start to test:\n";int test[] = { 0, 1, 2, 3, 5, 10, 40, 50, 100 };for (int i = 0; i < 9; i++){int num = test[i];cout << "use FibonacciOptimz(), num = " << num << ", result = " << FibonacciOptimz(num) << endl;}system("pause");return 0;
}
这种算法的时间复杂度是O(n)O(n),它采用循环的方法,每次循环的时候都保存中间值,并用于下次的计算。
对于斐波那契数列的应用,还有如下问题:
一只青蛙一次可以跳上一级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
这个问题也就是需要实现斐波那契数列。考虑最简单的情况,如果只有1级台阶,那显然只有一种跳法;如果有2级台阶,则有两种跳法,一次只跳1级和1次跳两级台阶。现在讨论一般情况,将n级台阶时的跳法看成是n的函数,记为f(n)f(n)。当n>2n\gt 2时,第一次跳的时候有两种选择,一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即f(n−1)f(n-1);另一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n−2)f(n-2)。因此n级台阶的不同跳法的总数f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2),也就是斐波那契数列。
当然,如果上述问题的条件变成:青蛙一次可以跳上1级台阶,也可以跳上2级⋯⋯\cdots \cdots它也可以跳上n级,问跳上n级台阶总共有多少种跳法。通过数学归纳法可以得到f(n)=2n−1f(n) = 2^{n-1}。
剑指offer--斐波那契数列相关推荐
- [剑指Offer]斐波那契数列、跳台阶、兔子数量问题(递归、非递归)(Java)
剑指Offer题目 斐波那契数列 题目描述 [剑指Offer 7]大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). [剑指Offer 8]一只青蛙 ...
- 剑指Offer——斐波那契数列
1.题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 2.代码实现 1 package com.baozi.offer; ...
- 剑指Offer 斐波那契数列
时间限制:1秒 空间限制:32768K 热度指数:332130 算法知识视频讲解 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 给出代码: ...
- c语言斐波那契数列_剑指Offer-10-I.斐波那契数列
题目 题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...
- 剑指Offer_07_斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39. 解题思路 利用递归求解,动态规划保存已求值的结果,提高效率. 利用循环,每次根据保存和前两 ...
- 2021-09-22剑指offer07.斐波那契数列
对于 < 2的数字,直接返回其本身即可. 对于 >=2的数字,取0,0,1作为循环开始最初的数字,每次循环得到的数字分别为1,2,3,5 因此每个数字循环的次数为当前的数字-1.
- 剑指offer 菲波那切数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 解决方案,递归和迭代: public class Solution {public int Fibon ...
- Python中斐波那契数列的四种写法
在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...
- 【每日一题】剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列
- 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列
题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...
最新文章
- Field、CopyField、DynamicField的一些简介,用法
- 成功解决Command quot;python setup.py egg_infoquot; failed with error code 1 in C:\Users\AppData\
- Windows下配置Tomcat使用https协议
- 零起点学算法82——数组中查找数
- pytorch 构造读取数据的工具类 Dataset 与 DataLoader (pytorch Data学习一)
- Js 获取 本周、本月起始时间
- python图书馆座位预约系统毕业设计开题报告
- bat 一键清理系统垃圾的修改
- antdesign图片点击放大_vue图片点击放大功能
- 第三章 群体用户画像分析
- 为什么选择ROS2编程作为机器人工程课程之一?
- idea 关于自动导包的设置
- 《Thinking In Java》作者:不要使用并发
- 思绪——关于《朝花夕誓——于离别之朝束起约定之花》
- Word 表格换页自动“续表”方法
- PCB Layout爬电距离、电气间隙的确定
- (1条消息) CodeForces 1278 B.A and B(Math)
- 电子天平的检定和检定结果的影响因素
- DX11 游戏开发笔记 (二) DX11 基础框架三角形 下
- 《实用VC编程之玩转控件》第1课:Windows编程简介
热门文章
- iangularjs 模板_2018-web前端的自我介绍-优秀word范文 (5页)
- java建一个conversion_Scala中的JavaConverters和JavaConversions之间有什么区别?
- 斐讯k1路由器刷Breed BootLoader(不死UBoot)
- [react] 如何提高组件的渲染效率呢?
- Taro+react开发(81):props属性
- React开发(124):ant design学习指南之form中的this.props.form
- [vue] vue的is这个特性你有用过吗?主要用在哪些方面?
- 前端学习(2887):如何短时间内实现v-for createApp解决方案
- [css] 什么是zoom?它有什么作用?
- 前端学习(2770):数据缓存