fibonacci求解

来源:互联网 发布:淘宝优惠券在哪领 编辑:程序博客网 时间:2024/06/05 15:44

fibonacci求解

fibonacci 斐波那契数组编程上比较常见的数组(1 1 2 3 5 8 13 …),其定义为:
从第三个数字开始,每个数字都是前两个数字之和

求解的方法有:

递归,自顶向下求解:

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

非递归1:维持一个数组(DP)

// 非递归1int Fib(int n){    int array[n] = {0};    array[1] = 1;    for (int i = 2; i < n; i++)        array[i] = array[i-1] + array[i-2];    return array[n-1];}

非递归2,维持n的前两个值(DP)

// 非递归2int Fib(int n){  if ( n == 0 || n == 1){      return 1;    }    int a = 1, b = 1;    int sum ;    for( int i = 2; i <= n; i ++ ){      // 注意a b更新的次序        sum = a+b;        a = b;        b = sum;        }    return sum;}

常见题目:

  • leetcode 中经典的爬楼梯问题
    You are climbing a stair case. It takes n steps to reach to the top.
    Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
    也就是 爬n个楼梯,一次爬1阶或2阶,走到n阶有几种走法

  • 兔子数组(Fibonacci 本质问题)
    假设每对兔子每月能生一对小兔子,小兔子长到第3个月时也开始生兔子。假设兔子不会死,问第n个月有多少个兔子

另外,算法导论上也有一个矩阵相乘的方法(很少用)

由Fibonacci数列的特性可以知道:

(1)当n>1时,可以发现Fib(n)和Fib(n-1)是互质的

(2)若定义一个i为奇数,则f(i)*f(i) = f(i-1)*f(i+1)-1;若i为偶数,则f(i)*f(i)=f(i-1)*f(i+1)-1

(3)f(n)=f(i)*f(n-i-1)+f(i+1)*f(n-i)

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

若要计算Fib(n),就是要先保存,令a = f(1),b = f(2),然后在进行运算,使a’=b,b’=a+b

可把a,b看做一个向量[a, b],然后乘以矩阵

0 1

1 1

即若要求第100个Fibonacci数,只需要将[1, 1]乘上

0 1

1 1 的100次方,再取出第一项即可。

时间复杂度:O(logn)
空间复杂度:O(1)

代码贴上来:

// Multiply two matrices// Input: matrix1 - the first matrix//        matrix2 - the second matrix//Output: the production of two matrices///////////////////////////////////////////////////////////////////////Matrix2By2 MatrixMultiply(      const Matrix2By2& matrix1,      const Matrix2By2& matrix2){      return Matrix2By2(            matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,            matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,            matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,            matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);}///////////////////////////////////////////////////////////////////////// The nth power of matrix // 1  1//  1  0///////////////////////////////////////////////////////////////////////Matrix2By2 MatrixPower(unsigned int n){  assert(n > 0);  Matrix2By2 matrix;  if(n == 1)  {    matrix = Matrix2By2(1, 1, 1, 0);  }  else if(n % 2 == 0)  {    matrix = MatrixPower(n / 2);    matrix = MatrixMultiply(matrix, matrix);  }  else if(n % 2 == 1)  {    matrix = MatrixPower((n - 1) / 2);    matrix = MatrixMultiply(matrix, matrix);    matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));  }  return matrix;}// templatesstruct Fib{    enum{        val = Fib<N-1>::val + Fib<N-2>::val    };};template <>struct Fib<0>{    enum{        val = 0    };};template <>struct Fib<1>{    enum{        val=1    };};
原创粉丝点击