记录来自《剑指offer》的算法题。

题目如下:

写一个函数,输入n,实现斐波那契数列的第n项。

斐波那契数列的定义如下:

f(n)=⎧⎩⎨01f(n−1)+f(n−2)n=0n=1n>1

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--斐波那契数列相关推荐

  1. [剑指Offer]斐波那契数列、跳台阶、兔子数量问题(递归、非递归)(Java)

    剑指Offer题目 斐波那契数列 题目描述 [剑指Offer 7]大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). [剑指Offer 8]一只青蛙 ...

  2. 剑指Offer——斐波那契数列

    1.题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 2.代码实现 1 package com.baozi.offer; ...

  3. 剑指Offer 斐波那契数列

    时间限制:1秒 空间限制:32768K 热度指数:332130 算法知识视频讲解 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 给出代码: ...

  4. c语言斐波那契数列_剑指Offer-10-I.斐波那契数列

    题目 题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...

  5. 剑指Offer_07_斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39. 解题思路 利用递归求解,动态规划保存已求值的结果,提高效率. 利用循环,每次根据保存和前两 ...

  6. 2021-09-22剑指offer07.斐波那契数列

    对于 < 2的数字,直接返回其本身即可. 对于 >=2的数字,取0,0,1作为循环开始最初的数字,每次循环得到的数字分别为1,2,3,5 因此每个数字循环的次数为当前的数字-1.

  7. 剑指offer 菲波那切数列

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 解决方案,递归和迭代: public class Solution {public int Fibon ...

  8. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...

  9. 【每日一题】剑指 Offer 10- I. 斐波那契数列

    剑指 Offer 10- I. 斐波那契数列

  10. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列

    题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...

最新文章

  1. Field、CopyField、DynamicField的一些简介,用法
  2. 成功解决Command quot;python setup.py egg_infoquot; failed with error code 1 in C:\Users\AppData\
  3. Windows下配置Tomcat使用https协议
  4. 零起点学算法82——数组中查找数
  5. pytorch 构造读取数据的工具类 Dataset 与 DataLoader (pytorch Data学习一)
  6. Js 获取 本周、本月起始时间
  7. python图书馆座位预约系统毕业设计开题报告
  8. bat 一键清理系统垃圾的修改
  9. antdesign图片点击放大_vue图片点击放大功能
  10. 第三章 群体用户画像分析
  11. 为什么选择ROS2编程作为机器人工程课程之一?
  12. idea 关于自动导包的设置
  13. 《Thinking In Java》作者:不要使用并发
  14. 思绪——关于《朝花夕誓——于离别之朝束起约定之花》
  15. Word 表格换页自动“续表”方法
  16. PCB Layout爬电距离、电气间隙的确定
  17. (1条消息) CodeForces 1278 B.A and B(Math)
  18. 电子天平的检定和检定结果的影响因素
  19. DX11 游戏开发笔记 (二) DX11 基础框架三角形 下
  20. 《实用VC编程之玩转控件》第1课:Windows编程简介

热门文章

  1. iangularjs 模板_2018-web前端的自我介绍-优秀word范文 (5页)
  2. java建一个conversion_Scala中的JavaConverters和JavaConversions之间有什么区别?
  3. 斐讯k1路由器刷Breed BootLoader(不死UBoot)
  4. [react] 如何提高组件的渲染效率呢?
  5. Taro+react开发(81):props属性
  6. React开发(124):ant design学习指南之form中的this.props.form
  7. [vue] vue的is这个特性你有用过吗?主要用在哪些方面?
  8. 前端学习(2887):如何短时间内实现v-for createApp解决方案
  9. [css] 什么是zoom?它有什么作用?
  10. 前端学习(2770):数据缓存