剑指Offer题目

斐波那契数列

题目描述

【剑指Offer 7】大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

【剑指Offer 8】一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

思路

斐波那切数列 :0 ,1,1,2,3,5,8,13...这样的数列称为斐波那契数列

斐波那切数列的应用:

  • 跳台阶: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
  • 兔子繁殖:一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

代码:

package com.my.test.codinginterviews.other;/*** * [剑指Offer-7]斐波那切数列 :0 ,1,1,2,3,5,8,13...这样的数列称为斐波那契数列* * [剑指Offer-8]跳台阶: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法* * 兔子繁殖:一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?* */
public class Fibonacci
{/*** n = 0 时 f(n) = 0* n = 1时 f(n) = 1* * n > 1时,f(n) = f(n-1) + f(n-2)* * 求f(n)*//*** 递归解法*/public static int fibonacci(int n) {if (n == 0 || n == 1) {return n;}return fibonacci(n-1) + fibonacci(n-2);}/*** 非递归解法*/public static int fibonacciII(int n) {if (n == 0 || n == 1) {return n;}// 缓存 三个值来实现int f1 = 0;int f2 = 1;int sum_n = 0;for (int i = 2; i <= n; i++) {sum_n = f1 + f2;f1 = f2;f2 = sum_n;}return sum_n;}/*** * 题目描述:*      一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法* 思路:*      得到n个台阶,一共可以跳多少个2步,这个也是一个斐波那契数列的一个应用。*      对于本题前提只有一次跳一阶,和跳两阶。*      如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n - 1)*      假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n - 2)那么这个时候就能够得到总的跳法为 f(n) = f(n - 1) + f(n - 2),*      然后这个出口就是:只有一阶的时候f(1) = 1, 只有两阶的时候f(2) = 2;*/public static int jumpFloor(int n) {if (n == 1 || n == 2) {return n;}return jumpFloor(n-1) + jumpFloor(n-2);}public static int jumpFloorII(int n) {if (n == 1 || n == 2) {return n;}// 三个指针来实现int f1 = 1;int f2 = 2;int cur = 0;for (int i=3; i<=n; i++) {cur = f1 + f2;f1 = f2;f2 = cur;}return cur;}/*** 斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。* 一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?* 我们不妨拿新出生的一对小兔子分析一下:* 第一个月小兔子没有繁殖能力,所以还是一对* 两个月后,生下一对小兔对数共有两对* 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对* ------* 依次类推* 幼仔对数=前月成兔对数* 成兔对数=前月成兔对数+前月幼仔对数* 总体对数=本月成兔对数+本月幼仔对数* 总体对数变化为: 1 1 2 3 5 8 13 21 34 55 89 144* 可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。* */public static int rabbitCount(int n) {if (n == 1 || n == 2) {return 1;}return rabbitCount(n-1) + rabbitCount(n-2);}public static int rabbitCountII(int n) {if (n == 1 || n == 2) {return 1;}// 三个指针来实现int f1 = 1;int f2 = 1;int cur = 0;for (int i=3; i<=n; i++) {cur = f1 + f2;f1 = f2;f2 = cur;}return cur;}public static void main(String[] args){// 斐波那契数列f(6)System.out.println("Fibonacci(6): " + fibonacci(6) + " <-> " + fibonacciII(6));// 跳到第6层台阶,有多少种跳法System.out.println("JumpFloor(6): " + jumpFloor(6) + " <-> " + jumpFloorII(6));// 一年后兔子的数量System.out.println("RabbitCount(12): " + rabbitCount(12) + " <-> " + rabbitCountII(12));}}

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

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

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

  2. 剑指Offer 斐波那契数列

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

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

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

  4. 剑指Offer_07_斐波那契数列

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

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

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

  6. 剑指offer 菲波那切数列

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

  7. 由递推关系式用差分方程的方法得到通项公式实现求斐波那契数列的第n项;迭代、递归、栈、差分方程之间的本质联系以及由推广的迭代法解决“变态青蛙跳台阶”问题;汉诺塔问题的数字特征以及用递归解决的原理推导。

    最近几天在研究算法中一个比较基础且突出的问题,就是关于"递推关系式.递归.迭代.序列前k项和"之间的区别与联系. 一.斐波那契数列与差分方程 首先我们考察一个经典的算法,求斐波那契 ...

  8. Java基础——斐波那契数列问题之兔子不死会有几只兔子

    已知:斐波那契数列的前几个数分别为0,1,1,2,3,5-从第三项开始,每一项都等于前两项的和.请接收用户输入的整数n,求出此数列的前n项. 效果如图: 思路://              0,  ...

  9. 斐波那契数列两种算法实现(循环,递归)

    首先是最简单的递归算法,相信很多初学者第一次接触递归这种算法都是从写一个斐波那契数列开始的. 这里除了递归算法之外我还会介绍循环算法 首先是最基础的递归算法 #include <stdio.h& ...

最新文章

  1. AVR开发 Arduino方法(附四) 参考文献与网址
  2. 实现迷你解析器把字符串解析成NestInteger类 Mini Parser
  3. c语言flash里能存文件吗,STM32内部FLASH打包读写
  4. python 编码文件json.loads json.dumps
  5. IOS上 关于状态栏的相关设置(UIStatusBar)和preferredStatusBarStyle不执行问题
  6. 两个矩阵相乘的乘法次数_C ++程序将两个数字相乘而不使用乘法运算符
  7. 批量修改文件夹或文件权限
  8. 酷狗直播联手腾讯游戏破圈“组团” 游戏直播正版化杀入重量级玩家
  9. python学习1(下载、安装)
  10. 2019腾讯广告算法大赛 决赛 Rank16解决方案
  11. YII with()
  12. Servlet和JSP
  13. 自然语言处理之 snownlp,分词、词性标注、情感分析、文本分类、提取关键词、文本相似度
  14. 一天一个产品分析之美拍_米米米米粒口红_新浪博客
  15. 数据包络分析--综合的双目标数据包络分析模型
  16. 微信浮窗是不是服务器保存,微信浮窗,真能解决小程序留存难题吗?
  17. .Net框架搭建之2、SQL Server MEF依赖注入 MVC Repository框架
  18. 什么是802.11ac和802.11ac Wave2
  19. 内边距padding
  20. macM1下PD虚拟机中ubuntu安装git过程中apt-get update失败、E: 部分索引文件下载失败等问题

热门文章

  1. acs流程图_两张流程图,搞定ACS后血脂管理
  2. STM32学习笔记(十七)TLTLCD显示实验
  3. Mybatis三剑客
  4. invalid button size rid: 5fd188c8-1d752f57-0d53f85f
  5. JS中如何阻止事件的传播
  6. 林业病虫害数据集介绍
  7. 场效应管(MOS管)
  8. 计算机组成原理 关于CPU中的LDAC和STAC指令
  9. 2021CCPC桂林游记
  10. 《乱音盒子》之《隐者小调》