斐波纳契数列(Fibonacci Sequence),又称黄金分割数列
为什么80%的码农都做不了架构师?>>>
#include <iostream>
#include <cmath>
using namespace std;typedef unsigned int uint;/**
* 斐波那契数列:1、1、2、3、5、8、13、21、……如果设F(n)为该数列的第n项(n∈N+)。那么这句话可以写成如下形式:F(1) = 1,F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3),显然这是一个线性递推数列。斐波那契数列通项公式F(n)=(√5/5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}(√5表示根号5)。
*/uint fibonacci_seq_loop(uint n);
uint fibonacci_seq_noloop(uint n);uint fibonacci_seq_loop(uint n)
{if (n==1 or n==2)return 1U;elsereturn fibonacci_seq_loop(n-1)+fibonacci_seq_loop(n-2);
}uint fiboncci_seq_noloop(uint n)
{//F(n) = F(n-1) + F(n-2) (n>=3)//F(1) = F(2) = 1uint nRet; // F(n)uint nP; // F(n-1)uint nPp; // F(n-2)nRet = nP = nPp = 1U;if(n==1 or n==2)return nRet;for(size_t i = 3; i <= n; i++){nRet = nP + nPp;nPp = nP;nP = nRet;}return nRet;
}uint fibonacci_format(uint n)
{return (uint)(sqrt(5.0)/5*( pow((1+sqrt(5.0))/2, n) - pow((1-sqrt(5.0))/2, n) ));
}int main()
{cout << "Fibonacci Sequence Generator" << endl;#if 10for(size_t n = 1; n < 100; n++)cout << n << '\t' << fiboncci_seq_noloop(n) << "\n";cout << endl;#endif#if 0for(size_t i = 1; i < 100; i++)cout << i << '\t' << fibonacci_format(i) << '\n';cout << endl;
#endifreturn 0;
}
分析3:最后介绍一种效率最高的算法O(logn),首先我们有下面的数学公式:
我们可以用数学归纳法证明如下:
Step1: n=2时
Step2:设n=k时,公式成立,则有:
等式两边同乘以[1,1;1,0]矩阵可得:
左=右,这正是n=k+1时的形式,即当n=k+1时等式成立。
由Step1和Step2可知,该数学公式成立。
由此可以知道该问题转化为计算右边矩阵的n-1幂问题。
我们利用分治的算法思想可以考虑如下求解一个数A的幂。
实现这种算法需要定义矩阵,以及矩阵的有关运算,具体代码如下:
#include<iostream>#include<string>using namespace std;//定义2×2矩阵;struct Matrix2by2{//构造函数Matrix2by2(long m_00,long m_01,long m_10,long m_11):m00(m_00),m01(m_01),m10(m_10),m11(m_11){}//数据成员long m00;long m01;long m10;long m11;};//定义2×2矩阵的乘法运算Matrix2by2 MatrixMultiply(const Matrix2by2& matrix1,const Matrix2by2& matrix2){Matrix2by2 matrix12(1,1,1,0);matrix12.m00 = matrix1.m00 * matrix2.m00 + matrix1.m01 * matrix2.m10;matrix12.m01 = matrix1.m00 * matrix2.m01 + matrix1.m01 * matrix2.m11;matrix12.m10 = matrix1.m10 * matrix2.m00 + matrix1.m11 * matrix2.m10;matrix12.m11 = matrix1.m10 * matrix2.m01 + matrix1.m11 * matrix2.m11;return matrix12;}//定义2×2矩阵的幂运算Matrix2by2 MatrixPower(unsigned int n){Matrix2by2 matrix(1,1,1,0);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;}//计算Fibnacci的第n项long Fibonacci(unsigned int n){if(n == 0)return 0;if(n == 1)return 1;Matrix2by2 fibMatrix = MatrixPower(n-1);return fibMatrix.m00;}int main(){cout<<"Enter A Number:"<<endl;unsigned int number;cin>>number;cout<<Fibonacci(number)<<endl;return 0;}
转载于:https://my.oschina.net/qihh/blog/93720
斐波纳契数列(Fibonacci Sequence),又称黄金分割数列相关推荐
- 斐波纳契数列 python123
def shulie(n):if n<=2:return 1else:return shulie(n-1)+shulie(n-2) n=int(input()) c=n for i in ran ...
- 斐波纳契数列(Fibonacci Sequence)
斐波纳契数列(Fibonacci Sequence) 0.前言 很久以前就想写一些竞赛学习的总结,但是由于之前事情比较多,导致计划不断的减缓.现在,大学教学任务的考试已经全部结束了,而比赛也告一段落 ...
- 一文解决斐波那契数列求前n项和;和求第n个数是多少的问题;斐波那契数列(Fibonacci)又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
题目:斐波那契数列(Fibonacci)又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)= 0,F(1) ...
- 斐波那契(Fibonacci,意大利数学家,1170年-1240年)数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……。这个数列从第三项开始,每一项都等于前两项之
Problem Description 斐波那契(Fibonacci,意大利数学家,1170年-1240年)数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--.这 ...
- [CS101] 转载:浅议Fibonacci(斐波纳契)数列求解
原文转载自林健随笔的"浅议Fibonacci(斐波纳契)数列求解" Fibonacci 数列 描述了动物繁殖数量.植物花序变化等自然规律.作为一个经典的数学问题,Fibonacci ...
- Python - Python3 编程第一步 Fibonacci series: 斐波纳契数列
Fibonacci series: 斐波纳契数列, 两个元素的总和确定了下一个数,例如:1 1 2 3 5 8 13 21 34 55 Python程序如下: def fibonacci1(n):a, ...
- 数学编程:经典数学编程案例之斐波那契:斐波那契数列的简介、代码实现、exe程序应用(斐波纳契时钟设计)之详细攻略
数学编程:经典数学编程案例之斐波那契:斐波那契数列的简介.代码实现.exe程序应用(斐波纳契时钟设计)之详细攻略 目录 斐波那契数列的简介 斐波那契数列代码实现 1.python代码实现 2.Java ...
- Python编程实现——斐波纳契数列
斐波纳契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...
- AS3实现经典算法(一) 斐波纳契数列
package{ /* 斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上, 斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n- ...
- python3斐波纳契数列
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1) ...
最新文章
- UBUNTU安装SSH和xrdp
- 如何用ipad制作精美的视频,并发布到视频网站
- 利用Jmeter测试CSRF令牌验证的Web API
- Server Tomcat v6.0 Server at localhost was unable to stat within 45 seconds
- Leetcode: Validate Binary Search Tree
- 华为ar2200路由器 策略路由_路由交换篇 06 华为路由器RIP协议的配置
- Requests库实战(四)---爬取肯德基餐厅地址信息
- 1.10 编程基础之简单排序 06 整数奇偶排序 python
- Google Adwords 关键字策略 – SEO数据搭配
- 超级终端设置-基本配置(华为)
- ERP已经凉凉?低代码平台真能成为下个风口吗?
- dedecms文章页面URL路径优化
- java获取当前行数
- asp.net实现页面无刷新效果
- 数据库存储 层次、树形结构 的标准做法
- 使用QPainter绘制饼状图,并显示所占百分比
- Unity 使用Mirror制作联机游戏
- 北大计算机系女神每天必看必学的IT公众号
- JVM规范(四)Frames
- 系统集成项目管理工程师笔记_备考常见英文词汇汇总