剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)
递归与循环
递归:在一个函数的内部调用这个函数。
本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算)
优点:简洁,易于实现。
缺点:时间和空间消耗严重,如果递归调用的层级太多,就会超出栈容量。
循环:通过设置计算的初始值及终止条件,在一个范围内重复运算。
斐波拉契数列
题目一:写一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项,定义如下:
第一种解法:用递归的算法:
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的时候的调用图如下:
从上图我们可以看到递归的时候,有很多数都被重复计算了,对性能带来极其负面的影响,改算法的时间复杂度为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级台阶的跳法。整个题目正好是一个斐波拉契数列。公式如下:
题目三:矩阵的覆盖,用八个2*1的小矩阵去覆盖一个2*8的大矩阵。如下图所示:
第一个小矩阵可以有两种覆盖方法横着,那么此时,必须由第二个小矩阵也横着,剩下2*6的大矩阵;竖着,那么还剩下2*7的大矩阵需要覆盖。因此可得:f(8)=f(6)+f(7).
公式同上第二题。
剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)的更多相关文章
- 【剑指offer】面试题 10. 斐波那契数列
面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...
- 剑指offer 面试题10:斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 编程思想 知道斐波拉契数列的规律即可. 编程实现 class Solu ...
- C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...
- 剑指Offer(书):斐波那契数列
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 分析:第一种方法:递归,45时,时间为5s,50时,我就等不及了.原因是重 ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 剑指offer 7. 递归和循环 斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 简简单单 废话不多说,直接上代码: public class Sol ...
- 剑指Offer面试题:7.斐波那契数列
一 题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二 效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 剑指offer——面试题10:斐波那契数列
个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...
- 《剑指offer》面试题9 斐波那契数列 Java版
书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...
随机推荐
- C# 设置程序开机自动运行(+注册表项)
有时候我们需要让软件安装好了,开机自动运行,这时我们需要把启动项加载到注册表中,需要注意的时现在很多杀毒软件在其他软件更改注册表的时候会有提示,可能会阻止.下面代码包含增加启动项到注册表和删除启动项. ...
- ExtJs之Ext.util.TaskRunner
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- BZOJ 1191: [HNOI2006]超级英雄Hero 二分匹配
1191: [HNOI2006]超级英雄Hero Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或 ...
- CSS3实现页面的平滑过渡
这是文件的css,全部文件的话请到Github下载:点击这里 @charset "UTF-8"; @font-face {font-family: 'iconfont'; src: ...
- 继电器Relay:ZZR08
继电器常识: 继电器有三个接线柱:常开(NO),常闭(NC),接地(C) 如果连接的时间长,偶尔需要断电, 那么接NC 和 C, 这样继电器set on 时为断电.除此之外,继电器还可以控制按键,以及 ...
- Linux Command Line 解析
Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...
- How a woman's glance can tell a man if she's interested
How a woman's glance can tell a man if she's interested揭秘:女人是否喜欢你?看眼神就知道The female mind has always b ...
- Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager
IPC框架分析 Binder,Service,Service manager 我首先从宏观的角度观察Binder,Service,Service Manager,并阐述各自的概念.从Linux的概念空 ...
- ps -ef能列出进程号,和端口号没任何关系
1.ps -ef显示所有进程ID 2.netstat才显示端口号情况