题目:

现在要求输入一个整数n,请你输出斐波那契数列的第n项。

斐波那契数列的定义:

f(0)=0;f(1)=1;

f(n)=f(n-1)+f(n-2)

思路:

1、递归:

根据递推公式来实现

优点:代码简单,易懂

缺点:

  • 效率低:函数递归调用过程中需要不断分配栈空间,且不断地入栈出栈,代码执行效率低;
  • 栈溢出:当递归层级太多时,会超出栈容量,导致栈溢出;
  • 复杂度高:递归调用存在大量的重复计算,时间复杂度以n的指数递增。

2、循环:

从下往上计算(动态规划),克服递归出现的缺陷

3、类似问题:

  • 青蛙跳台阶:

(1)一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法?

f(n)=f(n-1)+f(n-2)

f(1)=1;

f(2)=2;

(2)一只青蛙一次可以跳上1级,2级。。。n级,此时一只青蛙跳上一个n级的台阶总共有多少种跳法?

f(n)=f(n-1)+f(n-2)*2

f(1)=1;

f(2)=2;

数学归纳法证明:f(n)=2^(n-1)

  • 矩阵覆盖:

我们可以用2*1的小矩阵横着或者竖着去覆盖大的矩形,请问用8个2*1的小矩阵无重叠地覆盖一个2*8的大矩形,总共有多少种方法?

f(n)=f(n-1)+f(n-2)

f(1)=1;

f(2)=2;

代码:

#include <iostream>

using namespace std;

long long fibonacci_recursively(unsigned int n){
if(n<=0)
return 0;
if(n==1)
return 1;
return fibonacci_recursively(n-1)+fibonacci_recursively(n-2);
} long long fibonacci_iteratively(unsigned int n){
if(n<2)
return 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()
{
cout <<fibonacci_iteratively(100)<< endl;
cout <<fibonacci_recursively(100)<< endl;
return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/c6c7742f5ba7442aada113136ddea0c3?rp=1

AC代码:

class Solution {
public:
int Fibonacci(int n) {
if(n<2)
return n;
int fone=0;
int ftwo=1;
int fsum;
for(int i=2;i<=n;i++){
fsum=fone+ftwo;
fone=ftwo;
ftwo=fsum;
}
return fsum;
}
};

(剑指Offer)面试题9:斐波那契数列的更多相关文章

  1. 剑指Offer - 九度1387 - 斐波那契数列

    剑指Offer - 九度1387 - 斐波那契数列2013-11-24 03:08 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: ...

  2. 剑指offer第二版-10.斐波那契数列

    面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归 ...

  3. 【剑指offer】9、斐波拉契数列

    面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long ...

  4. 剑指offer【07】- 斐波那契数列(java)

    题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...

  5. 剑指offer(7)斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...

  6. 【剑指Offer】7、斐波那契数列

      题目描述:   大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).假设n<=39.   解题思路:   斐波那契数列:0,1,1,2,3, ...

  7. 【剑指offer】7:斐波那契数列

    题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结 ...

  8. 剑指offer——矩阵覆盖(斐波那契变形)

    ****感觉都可以针对斐波那契写一个变形题目的集合了****** 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? cl ...

  9. 【剑指offer】面试题 10. 斐波那契数列

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

  10. 剑指offer编程题Java实现——面试题9斐波那契数列

    题目:写一个函数,输入n,求斐波那契数列的第n项. package Solution; /** * 剑指offer面试题9:斐波那契数列 * 题目:写一个函数,输入n,求斐波那契数列的第n项. * 0 ...

随机推荐

  1. Linux_x86_Pwn溢出漏洞

    基础栈溢出:未开启任何保护的程序 漏洞程序源码 #include <stdio.h>#include <stdlib.h>#include <unistd.h>​v ...

  2. RxSwift 系列(四)

    前言 本篇文章将要学习RxSwift中四种转换操作符: map flatMap flatMapLatest scan map 通过使用一个闭包函数将原来的Observable序列转换为一个新的Obse ...

  3. CSS 笔记——阴影、圆角、旋转、光标

    7. 阴影.圆角.旋转.光标 (1)box-shadow 阴影 基本语法 text-shadow: h-shadow v-shadow blur color; box-shadow: h-shadow ...

  4. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

  5. luoguP4320 道路相遇 圆方树

    标题已经告诉你怎么做了..... 两点间的圆点个数即为所求 建出圆方树后打个树剖求$lca$就行..... 复杂度$O(n + q \log n)$ #include <cstdio> # ...

  6. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  7. 【贪心】【堆】Gym - 101485A - Assigning Workstations

    题意:有n个人,依次来到机房,给你他们每个人的到达时间和使用时间,你给他们分配电脑,要么新开一台, 要么给他一台别人用完以后没关的.一台电脑会在停止使用M分钟后自动关闭.让你最大化不需要新开电脑的总人 ...

  8. bzoj 3781

    又忘了给每个点标所属的块,瞬间就变成一个块了. 写莫队一定要试一下随机极限数据. /********************************************************** ...

  9. 11.m进制转十进制

    Strlen是字符串有多长就是多长,包括所有的元素和\0这个结束符 题目描述 Description 将m进制数n转化成一个十进制数 m<=16 题目保证转换后的十进制数<=100 输入描 ...

  10. noip200805笨小猴

    试题描述: 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最 ...