14天阅读挑战赛
*努力是为了不平庸~

算法知识点

递归、斐波那契数列

算法题目来源

异步社区

算法题目描述

假设第一个月有一对初生的兔子,第2个月进入成熟期,第三个月进行生育兔子,而一对成熟的 兔子每月会生1对兔子,兔子永不死去,那么从第一对初生的兔子开始,12个月后会有多少只兔子?

做题思路

不妨拿新出生的1对小兔子分析。
第1个月,小兔子①没有没有繁殖能力,所以还是1对
第2个月,小兔子①进入成熟期,所以还是1对
第3个月,兔子①生了一对兔子②,于是共有2对兔子
第4个月,兔子①生了一对兔子③,共有3对兔子

以此类推

这个数列有十分明显的特点:从第三个月开始,
当月的兔子数量 = 上月兔子数 + 当月新生兔子
当月新生兔子 = 上上个月的兔子
因此,前面相邻两项之和,便构成了后一项,换言之
当月兔子数 = 上月兔子数 + 上上月兔子数
斐波那契数列如下:
1,1,2,3,5,8,13,21,34,…
递归表达式如下:

模板代码

int Fib1(int n){if(n==1||n==2)   return 1;return Fib1(n-1)+Fib1(n-2);
}

做题过程中遇到的bug及解决方案

上面的代码是否正确?
算法复杂度如何?
算法是否能改进?

1、首先公式是推导出来的,算法正确性肯定没问题
2、那么复杂度呢
假设T(n) 表示计算Fib1(n)所需的基本操作次数,那么

n=1时,T(n)=1;
n=2时,T(n)=1;
n=3时,T(n)=3;//调用Fib1(2)和Fib1(1)并执行一次加法运算(Fib1(2)+Fib1(1))

因此,当n>2时候,

T(n)=T(n-1)+T(n-2)+1;

递归表达式 和时间复杂度T(n)的关系如下:

由此可得,T(n)>=F(n)
那么如何计算F(n)呢?
其中一种,就是画出F(n)的递归树,可以看出,时间复杂度是指数阶级的。

另一种是求斐波那契数列的通项公式:

算法改进:
斐波那契数列中的每一项(开头的两项除外)是前两项之和,如果记录前两项的值,则只需要一次加法运算就可以得到当前项的值,时间复杂度会不会降低一些呢?不妨用数组看看

int Fib2(int n){  int *F=new int[n+1];//定义一个长度为n+1的数组,空间尚未使用F[1]=1;F[2]=1;for(int i=3;i<=n;i++)F[i]=F[i-1]+F[i-2];return F[n];
}

很明显,时间复杂度为O(n),因为使用了辅助数组,所以空间复杂度也是O(n)。算法复杂度大大降低。

还可以使用迭代法来取消空间复杂度。

int Fib3(int n){if(n==1||n==2)   return 1;int s1=1; //用s1和s2记录前面的两项int s2=1;for(int i=3;i<=n;i++){int tmp=s1+s2;s1=s2;s2=tmp;}return s2;
}

这样空间复杂度就降到了O(1)。那还不能再降低呢?实际上还可以降低到O(logn),对数阶。

其他



算法详解 - 神奇的兔子数列相关推荐

  1. 趣味算法-神奇的兔子数列

    14天阅读挑战赛 趣味算法阅读体验 文章目录 1.<趣味算法>原文章节内容-神奇的兔子数列 2.算法设计-动态规划思想 1.<趣味算法>原文章节内容-神奇的兔子数列

  2. 神奇的兔子数列——算法学习笔记

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  3. Union-Find 并查集算法详解

    Union-Find 并查集算法详解 文章目录 Union-Find 并查集算法详解 一.问题介绍 二.基本思路 三.平衡性优化 四.路径压缩 五.总结 六.例题 一.问题介绍 简单说,动态连通性其实 ...

  4. Popular Cows POJ - 2186(tarjan算法)+详解

    题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...

  5. 7大排序算法详解+java实现

    目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...

  6. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  7. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  8. 14天阅读挑战赛(神奇的兔子数列)

    14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算 ...

  9. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. C#调用dll提示试图加载格式不正确的程序解决方法
  2. C#开发之问题汇总-vs运行正常,服务器IIS上报未能加载程序集
  3. 在maven中开发Spring需要的jar依赖
  4. VSTO 得到Office文档的选中内容(Word、Excel、PPT、Outlook)
  5. java system类_Java System类mapLibraryName()方法及示例
  6. 中国牛逼的程序员有哪些?入职华为两天转正,半个月升主任
  7. oracle-pl/sql之一
  8. 怎样应对“需求不确定型项目”?
  9. 90后占六成 花小猪如何吸引年轻人又安全不减配?
  10. 优酷直播节目“冠军体育课”第二季收官 共吸引近百万用户观看互动
  11. 【随笔】4.上海上港
  12. python矩形法求定积分_c程序用矩形法编一个通用函数求定积分0到1区间sinx,cosx,e的x次方,1+x,2x+3,(x*x)+1,e的x次方+1,(1+X)*(1+X),x*x*x...
  13. 聚观早报 | 范红卫登顶中国女首富;4个县级市获明确为大城市
  14. sql-server(模式创建)
  15. 树莓派+传感器+公网服务器 组件自己的物联网平台(四)制作一个智能鱼缸
  16. 计算机应用中的CAI,使用计算机来进行翻译属于计算机应用领域中的()。A.AIB.CAEC.CADD.CAI...
  17. 呼叫中心系统和外呼机器人的高效组合
  18. 通过新浪天气api查询天气
  19. web网页劫持是如何做到的、网页劫持是怎么做到的
  20. 单片机开发教程4——多文件编程

热门文章

  1. 考研几大坏习,玻璃心、拖延症、手机党...,你中了几条?
  2. skimage data函数库
  3. 本征正交分解(POD)入门(详解)
  4. Ensemble of the Deep Convolutional Network for Multiclass of Plant Disease Classi¯cation Using Leaf
  5. Consistency Models
  6. SQL SERVER数据库如何收缩日志
  7. 网络协议文档阅读笔记-TLS vs DTLS | Difference between TLS and DTLS
  8. 中企盟(北京)电商物流技术研究院与澳大利亚理昇律师事务所举行线上战略合作签约仪式
  9. JAVA打印web页面_JavaWeb实现打印功能
  10. buu [NCTF2019]Keyboard