剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

时间:2022-12-05 17:39:44

递归与循环

递归:在一个函数的内部调用这个函数。

本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算)

优点:简洁,易于实现。

缺点:时间和空间消耗严重,如果递归调用的层级太多,就会超出栈容量。

循环:通过设置计算的初始值及终止条件,在一个范围内重复运算。

斐波拉契数列

题目一:写一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项,定义如下:

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

第一种解法:用递归的算法:

long long Fabonacci(unsigned int n)
{
if(n<=0)
return 0;
if(n==1)
return 1;
return Fabonacci(n-1)+Fabonacci(n-2);
}

当n=10的时候的调用图如下:

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

从上图我们可以看到递归的时候,有很多数都被重复计算了,对性能带来极其负面的影响,改算法的时间复杂度为n的指数次方。

第二种解法:用循环(时间复杂度为O(n))

#include <iostream>
using namespace std;
long long Fabonacci(unsigned int n)
{
int arrary[]={,};
long long FabN; if(n<)
FabN=arrary[n];
long long FabOne=;
long long FabTwo=;
for(unsigned int i=;i<=n;++i)
{
FabN=FabOne+FabTwo;
FabTwo=FabOne;
FabOne=FabN;
}
return FabN;
}
void main()
{
long long n=Fabonacci();
cout<<n<<endl; }

java代码:

public class Fabonacci {
//斐波拉契数列的非递归的实现,用循环。时间复杂度为O(n)
public int fabonacci(int n){
int[] a={0,1};
if(n<2)
return a[n];
int FabOne=0;
int FabTwo=1;
int FabN=0;
for(int i=2;i<=n;i++){
FabN=FabOne+FabTwo;
FabOne=FabTwo;
FabTwo=FabN;
}
return FabN;
}
//斐波拉契数列的递归写法
public long fabonacci1(long n){
long fabN=0;
if(n<=0)
fabN=0;
else if(n==1)
fabN=1;
else
fabN=fabonacci1(n-1)+fabonacci1(n-2);
return fabN;
}
public static void main(String[] args){
Fabonacci fab=new Fabonacci();
int f=fab.fabonacci(5);
long f1=fab.fabonacci1(5);
System.out.println(f+" "+f1);
}
}

题目二:一只青蛙一次可以跳上一级台阶,也可以跳上2级台阶,求该青蛙跳上n级台阶的共有多少种跳法。

思路:当只有一级台阶的时候,青蛙的跳法也只有一种。当有两级台阶的时候,青蛙的跳法有两种(一是:一下跳两级台阶,二是:一级一级的跳)。当有n级台阶的时候,青蛙在第一次起跳的时候只跳了一级台阶,则还剩下n-1级台阶的跳法,如果在第一次起跳的时候跳了两级台阶,则还剩下n-2级台阶的跳法。整个题目正好是一个斐波拉契数列。公式如下:

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

题目三:矩阵的覆盖,用八个2*1的小矩阵去覆盖一个2*8的大矩阵。如下图所示:

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

第一个小矩阵可以有两种覆盖方法横着,那么此时,必须由第二个小矩阵也横着,剩下2*6的大矩阵;竖着,那么还剩下2*7的大矩阵需要覆盖。因此可得:f(8)=f(6)+f(7).

公式同上第二题。

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)的更多相关文章

  1. 【剑指offer】面试题 10&period; 斐波那契数列

    面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...

  2. 剑指offer 面试题10:斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 编程思想 知道斐波拉契数列的规律即可. 编程实现 class Solu ...

  3. C&num;版 - 剑指offer 面试题9:斐波那契数列及其变形&lpar;跳台阶、矩形覆盖&rpar; 题解

    面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...

  4. 剑指Offer(书):斐波那契数列

    题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 分析:第一种方法:递归,45时,时间为5s,50时,我就等不及了.原因是重 ...

  5. 剑指Offer面试题:8&period;斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  6. 剑指offer 7&period; 递归和循环 斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 简简单单 废话不多说,直接上代码: public class Sol ...

  7. 剑指Offer面试题:7&period;斐波那契数列

    一 题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二 效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  8. 剑指offer——面试题10:斐波那契数列

    个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...

  9. 《剑指offer》面试题9 斐波那契数列 Java版

    书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...

随机推荐

  1. 大话immutable&period;js

    为啥要用immutable.js呢.毫不夸张的说.有了immutable.js(当然也有其他实现库)..才能将react的性能发挥到极致!要是各位看官用过一段时间的react,而没有用immutabl ...

  2. 数据字典生成工具之旅&lpar;4&rpar;:NPOI操作EXECL

    这篇会介绍NPOI读写EXECL,读写EXECL的组件很多,可以使用微软自己的COM组件EXECL.exe读写,不过这种方式限制很大. 1:客户环境必须装Office(虽然现在机子上不装Office的 ...

  3. 2015 Multi-University Training Contest 2 1006 Friends

    Friends Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5305 Mean: n个人,m对朋友关系,每个人的朋友中又分为在线 ...

  4. php生成随机产生六位数密码的代码

    php生成随机产生六位数密码的代码,供大家学习参考.本文转自:http://www.jbxue.com/article/6199.html php生成随机产生六位数密码的代码,供大家学习参考. 复制代 ...

  5. 5&period;1、按键SW1控制LED1亮灭

    从图中可以看出,P1_2引脚可以感知SW1的状态,SW1未按下P1_2=1高电平,按下后P1_2=0接地. 注意:P1_2引脚只是感知SW1,不影响SW1. #include "ioCC25 ...

  6. 【学习】DataFrame&amp&semi;Series类【pandas】

    参考链接:http://blog.csdn.net/yhb315279058/article/details/50226027 DataFrame类: DataFrame有四个重要的属性: index ...

  7. hive拉链表

    前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成:先分享一下拉链表的用途.什么是拉链表.通过一些小的使用场景来对拉链表做 ...

  8. java&period;lang&period;NoClassDefFoundError&colon; org&sol;apache&sol;commons&sol;io&sol;output&sol;DeferredFileOutputStream

    java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream at org.apach ...

  9. Ng第十七课:大规模机器学习&lpar;Large Scale Machine Learning&rpar;

    17.1  大型数据集的学习 17.2  随机梯度下降法 17.3  微型批量梯度下降 17.4  随机梯度下降收敛 17.5  在线学习 17.6  映射化简和数据并行 17.1  大型数据集的学习 ...

  10. 存储树形的数据表转为Json

    /// <summary> /// 根据DataTable生成Json树结构 /// </summary> /// <param name="tabel&quo ...