《剑指offer》里面的这道题对fibonacci的常见计算方法进行了改进

#include<iostream>
using namespace std;long long Fibonacci_Solution1(unsigned int n)
{if (n <= 0)return 0;if (n == 1)return 1;return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
}// ====================方法2:循环====================
long long Fibonacci_Solution2(unsigned n)
{int result[2] = { 0, 1 };if (n < 2)return result[n];long long  fibNMinusOne = 1;long long  fibNMinusTwo = 0;long long  fibN = 0;for (unsigned int i = 2; i <= n; ++i){fibN = fibNMinusOne + fibNMinusTwo;//an=a(n-1)+a(n-2)fibNMinusTwo = fibNMinusOne;//注意这里的两句之所以看起来有些奇怪,是因为我们手算的时候都是一轮计算两个数,而这里的循环中一轮只计算1个数//这一句是an-1//fibNMinusOne = fibN;//an//以上两句是为了下一轮计算a(n+1)来作准备的}return fibN;
}// ====================方法3:基于矩阵乘法====================
#include <cassert>struct Matrix2By2
{Matrix2By2(long long m00 = 0,long long m01 = 0,long long m10 = 0,long long m11 = 0):m_00(m00), m_01(m01), m_10(m10), m_11(m11){}long long m_00;long long m_01;long long m_10;long long m_11;
};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);
}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;
}long long Fibonacci_Solution3(unsigned int n)
{int result[2] = { 0, 1 };if (n < 2)return result[n];Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);return PowerNMinus2.m_00;
}// ====================测试代码====================
void Test(int n, int expected)
{if (Fibonacci_Solution1(n) == expected)printf("Test for %d in solution1 passed.\n", n);elseprintf("Test for %d in solution1 failed.\n", n);if (Fibonacci_Solution2(n) == expected)printf("Test for %d in solution2 passed.\n", n);elseprintf("Test for %d in solution2 failed.\n", n);if (Fibonacci_Solution3(n) == expected)printf("Test for %d in solution3 passed.\n", n);elseprintf("Test for %d in solution3 failed.\n", n);
}int main()
{Test(0, 0);Test(1, 1);Test(2, 1);Test(3, 2);Test(4, 3);Test(5, 5);Test(6, 8);Test(7, 13);Test(8, 21);Test(9, 34);Test(10, 55);Test(40, 102334155);return 0;
}

09_Fibonacci相关推荐

最新文章

  1. Sqlserver2005 with as 实现分页以提高性能
  2. 嵌入式C语言代码的调试技巧
  3. .net获取客户端信息(二)ashx部分
  4. SAP UI5 control id generation by jQuery
  5. Faste R-CNN的安装及测试
  6. java markdown转word_一键将 Word 转换为 Markdown
  7. python的实例属性_python 实例属性和类属性
  8. 如何优雅地抄袭代码?天下代码一大抄,这才是正确的姿势
  9. pandas中size方法_eplot,在pandas中流畅的使用pyecharts!
  10. linux 安装_linux 安装 powershell
  11. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_03-vuejs研究-vuejs基础-入门程序...
  12. ORK包的安装与linemod算法识别测试 (使用kinect v2 出现很奇怪的问题和解决)
  13. 斯皮尔曼相关(spearman)系数法
  14. RT-Thread 应用笔记 - libmodbus RTU 编译问题的解决
  15. D类音频功放NS4110B电路设计
  16. c语言计算定积分有几种方法,C语言用6种方法求定积分.doc
  17. web嵌入flowplayer流媒体播放器
  18. android 动态修改logo,关于app动态修改logo的问题
  19. Java基础编程实现2-面向对象-类
  20. 员工辞职的真正原因:更想远离这样的领导,而不是这家公司

热门文章

  1. Objective-C setter和getter
  2. JS----JavaScript中防抖和节流知识概述
  3. Angular报错-Error: ENOENT: no such file or directory, scandir '/Users/echo_hx/node_modules'
  4. 百度地图API : 修改marker图标(icon)
  5. ERROR Invalid options in vue.config.js: “baseUrl“ is not allowed
  6. java 实现气泡 源码分析_冒泡排序算法原理及JAVA实现代码
  7. md文件编辑器_可能是颜值最高的微信Markdown编辑器,用Markdown的你一定会爱上
  8. node.js热部署
  9. JavaScript排序算法——插入排序算法
  10. Navicat 提示 Access violation at address ***(771B7870) in module ‘ntdll.dll’. Read of address ***(220A