博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer:斐波那契数列
阅读量:4914 次
发布时间:2019-06-11

本文共 1815 字,大约阅读时间需要 6 分钟。

题目:写一个函数,输入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

你可能感兴趣的文章
spi协议及工作原理分析
查看>>
c++ eof()函数
查看>>
查看人人网非好友的状态
查看>>
基于jeasyui的遮罩扩展[修复链式bug]
查看>>
2:Node.js 创建HTTP服务器
查看>>
PerfMon.exe通过命令管理计数器
查看>>
MCV3 添加视图的时候,如果强类型视图找不到Model
查看>>
python3 logging
查看>>
HDU - 1069 Monkey and Banana
查看>>
iTOP-4418开发板所用核心板研发7寸/10.1寸安卓触控一体机
查看>>
线程池
查看>>
全面具体介绍一个P2P网贷领域的ERP系统的主要功能
查看>>
「不啰嗦」和「说清楚」-20141223早读课
查看>>
怎样用Google APIs和Google的应用系统进行集成(2)----Google APIs的全部的RESTFul服务一览...
查看>>
MySQL优化建议
查看>>
js 中中括号,大括号使用详解
查看>>
读入Excel大文件解决方法
查看>>
几种流行Webservice框架性能对照
查看>>
MySQL基准测试
查看>>
hive_hiveserver2 hive-site.xml config and start
查看>>