求斐波那契(Fibonacci)数列通项的七种实现方法

C语言实现斐波那契数列的多种方法 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。 阅读详情

一:递归实现
使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。
二:数组实现
空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。
三:vector实现
时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源。
四:queue实现
当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复杂度和vector一样,但队列太适合这里了,
f(n)=f(n-1)+f(n-2),f(n)只和f(n-1)和f(n-2)有关,f(n)入队列后,f(n-2)就可以出队列了。
五:迭代实现
迭代实现是最高效的,时间复杂度是0(n),空间复杂度是0(1)。
六:公式实现
百度的时候,发现原来斐波那契数列有公式的,所以可以使用公式来计算的。
由于double类型的精度还不够,所以程序算出来的结果会有误差,如果把公式展开计算,得出的结果就是正确的。
这里写图片描述
求前四位

完整的实现代码如下:

#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
int fib1(int index)     //1递归实现
{
 if(index<1)
 {
  return -1;
 }
 if(index==1 || index==2)
  return 1;
 return fib1(index-1)+fib1(index-2);
}
int fib2(int index)     //2数组实现
{
 if(index<1)
 {
  return -1;
 }
 if(index<3)
 {
  return 1;
 }
 int *a=new int[index];
 a[0]=a[1]=1;
 for(int i=2;i<index;i++)
  a[i]=a[i-1]+a[i-2];
 int m=a[index-1];
 delete a;         //释放内存空间
 return m;
}
int fib3(int index)           //3借用vector<int>实现
{
 if(index<1)
 {
  return -1;
 }
 vector<int> a(2,1);      //创建一个含有2个元素都为1的向量
 a.reserve(3);
 for(int i=2;i<index;i++)
 {
  a.insert(a.begin(),a.at(0)+a.at(1));
  a.pop_back();
 }
 return a.at(0);
} 
int fib4(int index)       //4队列实现
{
 if(index<1)
 {
  return -1;
 }
 queue<int>q;
 q.push(1);
 q.push(1);
 for(int i=2;i<index;i++)
 {
  q.push(q.front()+q.back());
  q.pop();
 }
 return q.back();
}
int fib5(int n)          //5迭代实现
{
 int i,a=1,b=1,c=1;
 if(n<1)
 {
  return -1;
 }
 for(i=2;i<n;i++)
 {
  c=a+b;     //辗转相加法(类似于求最大公约数的辗转相除法)
  a=b;
  b=c;
 }
 return c;
}
int fib6(int n)//6
{
 double gh5=sqrt((double)5);
 return (pow((1+gh5),n)-pow((1-gh5),n))/(pow((double)2,n)*gh5);
} 
int main(void)
{
 printf("%d\n",fib3(6));
 system("pause");
 return 0;
}

第七种实用性不是特别强在此不做表示。(mdzz)
ps:现世报啊,那天刚用了,矩阵快速幂求斐波那锲,不然会超时,二分矩阵

void multiply(int c[2][2],int a[2][2],int b[2][2],int mod)
{
 int tmp[4];
 tmp[0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
 tmp[1]=a[0][0]*b[0][1]+a[0][1]*b[1][1];
 tmp[2]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
 tmp[3]=a[1][0]*b[0][1]+a[1][1]*b[1][1];
 c[0][0]=tmp[0]%mod;
 c[0][1]=tmp[1]%mod;
 c[1][0]=tmp[2]%mod;
 c[1][1]=tmp[3]%mod;
}//计算矩阵乘法,c=a*b
int fibonacci(int n,int mod)//mod表示数字太大时需要模的数
{
 if(n==0)return 0;
 else if(n<=2)return 1;//这里表示第0项为0,第1,2项为1
 int a[2][2]={{1,1},{1,0}};
 int result[2][2]={{1,0},{0,1}};//初始化为单位矩阵
 int s;
 n-=2;
 while(n>0)
 {
  if(n%2 == 1)
   multiply(result,result,a,mod);
  multiply(a,a,a,mod);
  n /= 2;
 }//二分法求矩阵幂
 s=(result[0][0]+result[0][1])%mod;//结果
 return s;
}
斐波那契数列(Fibonacci sequence)【思路及实现】 定义 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N... 阅读详情

相关推荐

斐波那契数列 (Fibonacci) 多种实现方法(Python)与详细介绍

斐波那契数列 Fibonacci Sequence 介绍了多种方式得到斐波那契数列或斐波那契数。斐波那契数列也称为“兔子数列”。来源于兔子生产的预测。 Fibonacci 数列定义为: F0=0,F1=1,Fn=Fn−1+Fn−2;n≥2,n∈N+F_0=0, F_1=1, F_{n}=F_{n-1}+F_{n-2}; n\geq 2, n\in \mathbb{N}^+F0​=0,F1​=1,Fn​=Fn−1​+Fn−2​;n≥2,n∈N+ 大量 Python 代码生成斐波那契数和数列。

liu_xiang的博客 7565

【C语言入门】用递归方法编写函数处理Fibonicci数列问题,编程并计算该数列的第七项值f(7)

题目:用递归方法编写函数处理Fibonicci数列问题,编程并计算该数列的第七项值f(7)其中: 1 (n = 1,2)

StevenWPY的博客 563

DELL服务器BIOS下配置RAID阵列

dell服务器配置raid阵列

weixin_58250887的博客 1万+

斐波那契数列的5种算法

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1,F(n)=F(n - 1)+F(n - 2)(n≥ 2,n∈ N*) 一、循环法: int fib(int n){ if(n==1||n==2) return 1; ...

Sakeyuan的博客 3万+

【经验分享】使用Keil5烧录代码遇到的问题及解决方法

本文介绍了在使用Keil5烧录代码过程中可能遇到的常见问题,主要为编译错误和下载失败,并提供了解决方案和注意事项。通过本文中提供的具体解决方案和注意事项,希望能够帮助读者更加顺利地进行Keil5烧录代码操作,提高开发效率和成果实现。

qq_63195670的博客 1万+

<硬件设计> 阻抗设计(二) 使用Si9000计算阻抗

阻抗设计(二) 使用Si9000计算阻抗

杰克拉力船长个人博客 1万+

斐波那契数列通项公式推导

斐波那契数列通项公式推推导

英雄哪里出来 14万+

開機自動進入UEFI Interactive Shell無法正常開機怎麼辦?

BIOS/UEFI,啟動後進入UEFI Interactive Shell大多數人都告訴你沒有安裝系統去裝系統吧,但你明明昨天還在運行系統?今天就這樣?有沒有解決辦法?

sheaahhoi1的博客 7740

《剑指Offer》第二版之斐波那契数列(七)

目录 题目 思路 步骤 代码 题目: 求斐波那契数列的第n项。 思路: 先把已经得到的数列中间项保存起来,在下次需要计算的时候我们先查找一下,如果前面已经计算就不要在重复计算了。 步骤: 1.首先根据f(0)和f(1)算出f(2)。 2.再根据f(1)和f(2)算出f(3)......以此类推就可以算出第n项了。 代码: package test; public class Fibo...

Sleeping的专栏 313

【Educoder作业】※ 数字图像——绿幕抠像

这次作业比上一篇博客基本得多,大多都是基础函数的运用。没啥说的,就整个sizesizesize即可。 T2 获取一个像素 T3 图像反色 T4 修改透明度 ′RGBA′'RGBA'′RGBA′也是一种图像格式 T5 抠图 T6 添加场景 这个主要是pastepastepaste函数里面的maskmaskmask参量没整明白,转载一篇博客供参考。...

JZYshuraK的博客 7571

在 SAP 系统中设置成本中心(Cost Center)和利润中心(Profit Center)需在管理会计(CO)模块中完成,涉及主数据创建、组织结构配置等步骤

本文详细介绍了SAP系统中成本中心和利润中心的设置流程。成本中心设置包括:配置成本控制范围、定义标准层次结构、创建主数据(KS01/KS02/KS03)等步骤。利润中心设置需先激活利润中心会计功能,再定义标准层次并创建主数据(KE01/KE02/KE03)。关键是将成本中心与利润中心关联,实现成本数据自动流向利润中心。最后可通过相关报表验证设置是否生效。整个流程强调主数据创建和组织结构关联,以实现成本归集和利润分析功能。

金牌架构师 2220

七种方式求斐波那契(Fibonacci)数列通项

一:递归实现   使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。 二:数组实现   空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。 三:vector&lt;int&gt;实现   时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源。 四:queue&...

编程资料大全 453

PCL ——LevenbergMarquardt非线性最小二乘法拟合圆柱(C++详细过程版)

使用C++详细过程版实现的LevenbergMarquardt非线性最小二乘法拟合圆柱

点云侠的博客 606

C语言二维数组求斐波拉数列,求斐波那契(Fibonacci)数列通项的七种实现方法

一:递归实现使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。二:数组实现空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。三:vector实现时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源。四:queue实现当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复...

weixin_33788424的博客 1352

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

灵境引路人 3227

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C语言编程】求Fibonacci(斐波那契)数列前40个数

问题: 求Fibonacci(斐波那契)数列前40个数。 分析: 这个数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,… ,用数学方式表示为: 代码: #include <stdio.h> int main() { int f1 = 1,f2 = 1; int i; for (int i ...

Toufahaizai的博客 4万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

在C语言中用函数求fibonacci(斐波那契)数列前n项的和

C语言中用函数求fibonacci数列前n项的和。

2402_88478893的博客 2915

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C语言——求前20项的斐波那契数列的三种不同方法

编程输出前20项的斐波那契数列 3种不同的实现方法。 一:数组累加 二:变量覆盖(挨个值覆盖) 三:变量覆盖(两个值一起覆盖)

猪儿君的博客 1万+

求斐波那契数列的第n项与前n项和

求斐波那契数列的第n项与前n项和 斐波那契数列即从第三项开始每一项都等于它的前两项之和 求斐波那契数列第n项与前n项和常用的方法有两种,分别是递归和数组 (一)递归 #include<stdio.h> int Fibon(int n) { if(n <= 2) { return 1; } else { re...

qq_43579888的博客 1万+

求斐波那契数列第n项的值

本期介绍🍖主要介绍:什么是斐波那契数列,递归实现求斐波那契数列第n项值,递归法为什么不适合求斐波那契数,用迭代法实现求斐波那契数列的值👀。

m0_66769266的博客 1448

斐波那契数列的递归,迭代(循环),通项公式三种实现

斐波那契数列的递归,迭代(循环),通项公式三种实现

hfrujhv的博客 4304

用python实现(Fibonacci sequence)斐波那契数列的三种方法

斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……

小小怪的博客 6218
上一篇: Q-Prime Ring Problem
下一篇: C++中的类型重定义
TimEckel
博客等级 码龄10年 16粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值