剑指offer:斐波那契数列

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


暴力简单解法:
  1. long long Fibonacci(unsigned int n)
  2. {
  3. if(n<=0)
  4. return 0;
  5. if(n==1)
  6. return 1;
  7. return Fibonacci(n-1)+Fabonacci(n-2);
  8. }
利用循环改进之后,这个的时间复杂度是o(n)
  1. // ====================方法2:循环====================
  2. long long Fibonacci_Solution2(unsigned n)
  3. {
  4. int result[2] = {0, 1};
  5. if(n < 2)
  6. return result[n];
  7. long long fibNMinusOne = 1;
  8. long long fibNMinusTwo = 0;
  9. long long fibN = 0;
  10. for(unsigned int i = 2; i <= n; ++ i)
  11. {
  12. fibN = fibNMinusOne + fibNMinusTwo;
  13. fibNMinusTwo = fibNMinusOne;
  14. fibNMinusOne = fibN;
  15. }
  16. return fibN;
  17. }
第三种方法:利用如下的一个公式


  1. // ====================方法3:基于矩阵乘法====================
  2. #include <cassert>
  3. struct Matrix2By2
  4. {
  5. Matrix2By2
  6. (
  7. long long m00 = 0,
  8. long long m01 = 0,
  9. long long m10 = 0,
  10. long long m11 = 0
  11. )
  12. :m_00(m00), m_01(m01), m_10(m10), m_11(m11)
  13. {
  14. }
  15. long long m_00;
  16. long long m_01;
  17. long long m_10;
  18. long long m_11;
  19. };
  20. Matrix2By2 MatrixMultiply
  21. (
  22. const Matrix2By2& matrix1,
  23. const Matrix2By2& matrix2
  24. )
  25. {
  26. return Matrix2By2(
  27. matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,
  28. matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,
  29. matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,
  30. matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);
  31. }
  32. Matrix2By2 MatrixPower(unsigned int n)
  33. {
  34. assert(n > 0);
  35. Matrix2By2 matrix;
  36. if(n == 1)
  37. {
  38. matrix = Matrix2By2(1, 1, 1, 0);
  39. }
  40. else if(n % 2 == 0)
  41. {
  42. matrix = MatrixPower(n / 2);
  43. matrix = MatrixMultiply(matrix, matrix);
  44. }
  45. else if(n % 2 == 1)
  46. {
  47. matrix = MatrixPower((n - 1) / 2);
  48. matrix = MatrixMultiply(matrix, matrix);
  49. matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));
  50. }
  51. return matrix;
  52. }
  53. long long Fibonacci_Solution3(unsigned int n)
  54. {
  55. int result[2] = {0, 1};
  56. if(n < 2)
  57. return result[n];
  58. Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);
  59. return PowerNMinus2.m_00;
  60. }






原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4664484.html