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

原创 2016年08月29日 15:22:30

题目

写一个函数,输入n, 求斐波那契数列的第n项。

递归

问题规模为:
T(n)=T(n1)+T(n2)
如果我们估计一下,让 T(n1)=T(n2)
那么T(n)=2T(n1)
那么O(n)=2n

简介而不高效

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

递推

一次遍历,复杂度为O(n)
个人觉得是最优,省空间,省时间

long long Fibonacci(int n) {
    if (n <= 0) return 0;
    if (n == 1) return 1;
    long long n2 = 0;
    long long n1 = 1;
    long long n0;
    for (int i = 2; i <= n; i ++) {
        n0 = n2 + n1;
        n2 = n1;
        n1 = n0;
    }   
    return n0;
}

矩阵乘法

原理就是:

[f(n)f(n1)f(n1)f(n2)]=[1110]n1

如果加上快速幂的话,复杂度可以变为O(logn)

我自己实现之前用类实现了一个矩阵,重载了^, *等运算符,具体在:
https://github.com/preke/AimToOffer/blob/master/class_matrix.c%2B%2B

所以下面的实现只写函数:

Matrix FastPower(const Matrix & m, int n) {
    if (n == 1) {
        return m;
    }
    if (n % 2 == 0) {
        return FastPower(m, n/2) * FastPower(m, n/2);
    } else {
        return FastPower(m, (n - 1)/2) * FastPower(m, (n - 1)/2) * m;
    }
}

Matrix m = Matrix(2, 2); //在此我们输入 1,1,1,0 初始化这个矩阵
int Fibonacci(int n) {
    if (n <= 0) return 0;
    if (n == 1) return 1;   
    Matrix m1 = m;
    m1 = FastPower(m1, n-1);
    return m1.get(0, 0); //为f(n)
}


int main() {
    for(int i = 0; i < 10; i ++)
        cout << Fibonacci(i) << endl;

}

(数据类型这里用int,如果要用大数的话,可以自己换数据类型)

版权声明:欢迎转载,但是转载请注明出处

剑指Offer面试题9(java版)斐波那契数列

题目一:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下: 1、效率很低效的解法,挑剔的面试官不会喜欢 很多C语言的教科书在讲述递归函数的时候,都户拿Fibonacci作为例子,...
  • jsqfengbao
  • jsqfengbao
  • 2015年07月29日 08:47
  • 1642

[剑指offer]面试题9:斐波那契数列

题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n...
  • iamxiaofeifei
  • iamxiaofeifei
  • 2017年09月30日 14:07
  • 149

剑指Offer面试题9斐波那契数列

面试题9:斐波那契数列 写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列定义如下:n=0时,f(n)=0;n=1时,f(n)=1;n>1时,f(n)=f(n-1)+f(n-2) 思路1:先...
  • login_sonata
  • login_sonata
  • 2017年03月04日 20:35
  • 200

剑指offer - 面试题9:斐波那契数列

package Chapter2; /** * 面试题9:菲波那切数列 * 输入一个整数n,请你输出斐波那契数列的第n项。 * 1、1、2、3、5、8、13、21、34、 */ /* * ...
  • PeersLee
  • PeersLee
  • 2017年11月07日 09:36
  • 102

《剑指offer》(面试题9):斐波那契数列

前言 如果我们需要重复地多次计算相同的问题,通常可以选择用递归或者循环两种不同的方法。递归式在一个函数的内部调用这个函数自身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。...
  • a168861888m
  • a168861888m
  • 2018年01月31日 11:00
  • 4

剑指offer:面试题9,斐波那契数列

递归算法 #include #include int fibonacci(int n) { if (n { return 0; } if (n==1) { return 1; } return...
  • Dakuan_chen
  • Dakuan_chen
  • 2016年11月07日 19:15
  • 176

剑指offer面试题9 斐波那契数列

解题思路:传统的利用递归求斐波那契数列的第n项,遇到挑剔的面试官,可能他们不会喜欢,因为这种方法中存在比较多的重复计算,当n较大时,会严重影响算法的效率,因此采用其他思路。更简单的方法是从下往上计算,...
  • u013398759
  • u013398759
  • 2017年08月11日 19:36
  • 54

剑指offer 面试题9 斐波那契数列

E:\arithmetic\Fibonacci O(n) 注意性能的要求 ,数特别大的时候要用long long 或者更大要...
  • tuantuanlin
  • tuantuanlin
  • 2014年07月15日 13:07
  • 229

剑指Offer:面试题9 斐波那契数列

/* 斐波那契数列: 写一个函数,输入n,求斐波那契数列的第n项 f(n)={0,n=0      {1,n=1 {f(n-1)+f(n-2),n>1 输入: 11 输出: 89 */ #includ...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2014年09月06日 01:11
  • 455

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

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下: 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1 ...
  • a45872055555
  • a45872055555
  • 2014年06月13日 22:39
  • 508
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【剑指offer】面试题9:斐波那契数列
举报原因:
原因补充:

(最多只允许输入30个字)