09_Fibonacci
2024-05-27 20:41:03
《剑指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相关推荐
最新文章
- Sqlserver2005 with as 实现分页以提高性能
- 嵌入式C语言代码的调试技巧
- .net获取客户端信息(二)ashx部分
- SAP UI5 control id generation by jQuery
- Faste R-CNN的安装及测试
- java markdown转word_一键将 Word 转换为 Markdown
- python的实例属性_python 实例属性和类属性
- 如何优雅地抄袭代码?天下代码一大抄,这才是正确的姿势
- pandas中size方法_eplot,在pandas中流畅的使用pyecharts!
- linux 安装_linux 安装 powershell
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_03-vuejs研究-vuejs基础-入门程序...
- ORK包的安装与linemod算法识别测试 (使用kinect v2 出现很奇怪的问题和解决)
- 斯皮尔曼相关(spearman)系数法
- RT-Thread 应用笔记 - libmodbus RTU 编译问题的解决
- D类音频功放NS4110B电路设计
- c语言计算定积分有几种方法,C语言用6种方法求定积分.doc
- web嵌入flowplayer流媒体播放器
- android 动态修改logo,关于app动态修改logo的问题
- Java基础编程实现2-面向对象-类
- 员工辞职的真正原因:更想远离这样的领导,而不是这家公司
热门文章
- Objective-C setter和getter
- JS----JavaScript中防抖和节流知识概述
- Angular报错-Error: ENOENT: no such file or directory, scandir '/Users/echo_hx/node_modules'
- 百度地图API : 修改marker图标(icon)
- ERROR Invalid options in vue.config.js: “baseUrl“ is not allowed
- java 实现气泡 源码分析_冒泡排序算法原理及JAVA实现代码
- md文件编辑器_可能是颜值最高的微信Markdown编辑器,用Markdown的你一定会爱上
- node.js热部署
- JavaScript排序算法——插入排序算法
- Navicat 提示 Access violation at address ***(771B7870) in module ‘ntdll.dll’. Read of address ***(220A