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

article/2025/10/12 16:13:31

一:递归实现
  使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。
二:数组实现
  空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。
三:vector<int>实现
  时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源。
四:queue<int>实现
  当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复杂度和vector<int>一样,但队列太适合这里了,
  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)     //递归实现
{if(index<1){return -1;}if(index==1 || index==2)return 1;return fib1(index-1)+fib1(index-2);
}
int fib2(int index)     //数组实现
{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)           //借用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)       //队列实现
{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)          //迭代实现
{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)
{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;
}

七:二分矩阵方法

如上图,Fibonacci 数列中任何一项可以用矩阵幂算出,而n次幂是可以在logn的时间内算出的。
下面贴出代码:

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*bint fibonacci(int n,int mod)//mod表示数字太大时需要模的数
{if(n==0)return 0;else if(n<=2)return 1;//这里表示第0项为0,第1,2项为1int 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;
}
附带的再贴上二分法计算a的n次方函数。

int pow(int a,int n)
{int ans=1;while(n){if(n&1)ans*=a;a*=a;n>>=1;}return ans;
}




http://chatgpt.dhexx.cn/article/lffHrUq3.shtml

相关文章

响应式 - 基于尺寸的响应式内边距

前言 为了衬托一个响应式宽度的图像元素&#xff0c;需要添加相对的内边距。如果使用静态的宽度内边距&#xff0c;图像内边距在较小的浏览器窗口中可能会显得过大&#xff0c;从而与其他附近元素相互挤压&#xff0c;甚至可能将图像挤出屏幕。 准备工作 理解盒模型属性的计算…

响应式 - 基于min-width和max-width属性的响应式布局

前言 响应式布局的很多解决方案都相当复杂&#xff0c;但是本节中的方法却非常简单。该方法通过在3个浮动元素上设置min-width和max-width属性来实现响应式布局。只要采用CSS中这个非常简单的响应式布局特性&#xff0c;就能够适应移动设备和不同尺寸的计算机屏幕。 准备工作 …

【愚公系列】2023年07月 WPF+上位机+工业互联 002-WPF布局控件

文章目录 前言一、WPF布局控件1.无边框设计2.理解布局2.1 WPF的布局处理2.1 布局原则2.3 布局过程 3.布局控件3.1 Grid控件3.1.1 属性3.1.2 案例 3.2 StackPanel控件3.2.1 属性3.2.2 案例 3.3 DockPanel3.3.1 属性3.3.2 案例 3.4 WrapPanel3.4.1 属性3.4.2 案例 3.5 UniformGri…

WordPress响应式主题:Three/博客/CMS/博客导航三合一主题

效果演示:http://cxyo.vip/ 下载地址在最后面 主题使用说明 1、首页设置 ①选择首页布局&#xff1a;博客布局或杂志布局或博客导航&#xff0c;默认博客布局&#xff0c;若选择杂志布局或博客导航后&#xff0c;必须设置CMS/导航布局后才能正常显示&#xff0c;否则会错位。…

使用dedecms构建响应式站点(二)——系统设置

在上一篇文章中&#xff0c;我们介绍了使用dedecms构建响应式站点的安装部分&#xff0c;这一次&#xff0c;我们来讲讲dedecms系统安装后的初始状态下如何进行各项系统设置。 进入管理后台后&#xff0c;我们会看到系统的管理菜单&#xff0c;如下图所示&#xff1a; 通过菜单…

浏览器请求与响应全过程详解

3. 浏览器请求与响应全过程详解 前言 当在浏览器上输入一个网站链接时&#xff0c;它是如何运行将网页内容呈现在我们的浏览器上的呢&#xff1f; 本文旨在对www.yangoogle.com网页进行详细分析&#xff0c;了解浏览器展示内容的整个流程。下图是在网上检索到一个较清晰的流程…

android创建布局文件,android学习——Android Studio下创建menu布局文件

一、问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下图: 但是会发现新建的布局文件好像很奇怪,不能添加menu以及item,如下图: 二、解决办法: 经过百度才知道…

当前比较流行的页面布局方式

1.固定宽度布局&#xff1a;当前各大网站的页面都是固定宽度布局。 优点&#xff1a;更好的适应当前市场上所有的设备&#xff1a;我们知道当前市面上主流的集中分辨率为以下几种 800*600 1024*768 1280*1024等属于普通显示器所支持的分辨率 1280*800 一般是14宽屏笔记本的最…

响应式 概念

&#xfeff;&#xfeff; 原文地址&#xff1a;http://isux.tencent.com/responsive-web-design.html 概念 响应式网页设计最初是由 Ethan Marcotte 提出的一个概念&#xff1a;为什么一定要为每个用户群各自打造一套设计和开发方案&#xff1f;Web设计应该做到根据不同设备环…

【iOS架构】iOS ReactiveCocoa函数响应式编程

声明式编程 声明式编程&#xff08;declarative programming&#xff09;是一种编程范型&#xff0c;与命令式编程相对立。它描述目标的性质&#xff0c;让电脑明白目标&#xff0c;而非流程。声明式编程不用告诉电脑问题领域&#xff0c;从而避免随之而来的副作用&#xff0c;…

基于AntDesign Vue的响应式登录页面

为了做一个自己的前后端分离的后台管理系统&#xff0c;特地做了一下登录页面。大概的架子如下&#xff0c;后面需要替换一下顶部导航的信息。先大概贴一下代码&#xff0c;以后直接复制使用。整体的布局是自己写的样式&#xff0c;如果后面要替换为其他的UI框架&#xff0c;比…

Angular最新教程-第六节编写响应式导航栏

这节课我们讲解如何使用bootstrap 4 编写响应式布局。 参考图我们还是参照Angular中文社区http://www.angularjs.cn/ 图中标注红色的部分,我自己不是很喜欢,所以做了一点小改动。 他这里也没有做响应式布局,所以样式就不抄他的,我们自己重写。 首先我们先简要的分析一…

什么是响应式网页设计?响应式布局的实现原理

2019独角兽企业重金招聘Python工程师标准>>> 概念 响应式网页设计最初是由 Ethan Marcotte 提出的一个概念&#xff1a;为什么一定要为每个用户群各自打造一套设计和开发方案&#xff1f;Web设计应该做到根据不同设备环境自动响应及调整。当然响应式Web设计不仅仅是…

【Bootstrap】两个常用布局,居中布局和全屏左右布局,响应式布局

居中布局 居中布局&#xff0c;上面为菜单&#xff0c;下面为内容&#xff0c;内容居中&#xff0c;无论屏幕多宽&#xff0c;内容总是在中间 代码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; cha…

响应式页面实现

响应式网页设计最初是由 Ethan Marcotte 提出的一个概念&#xff1a;为什么一定要为每个用户群各自打造一套设计和开发方案&#xff1f;Web设计应该做到根据不同设备环境自动响应及调整。当然响应式Web设计不仅仅是关于屏幕分辨率自适应以及自动缩放的图片等等&#xff0c;它更…

移动端页面布局(响应式布局)以及meta标签的设置

响应式网站设计 什么是响应式布局? 1、服务器根据不同的浏览器用户端,为用户呈现不同的页面效果。 2、可以让一个网站兼容不同分辨率的设备,给用户更好的视觉使用体验。 3、移动互联网催生了响应式布局的诞生。 响应式设计优缺点 优点: 解决了设备之间的差异化展示,让不同的…

移动端基础及响应式布局

目录 1.移动端概述和hybird模式 2.响应式布局基础 3.响应式布局之流式布局 4.做移动端项目之前的准备 5.响应式布局demo 6.rem响应式布局 7.swiper的使用和轮播图 8.综合案例-微信场景应用 1.移动端概述和hybird模式 移动端&#xff1a;运行在移动设备上的产品 产品…

linux 透明图片,FreeImage 生成带透明通道的GIF

FreeImage 生成带透明通道的GIF 主要方法&#xff1a; 加载图像及读取参数 FreeImage_Load FreeImage_GetWidth FreeImage_GetHeight FreeImage_Allocate FreeImage_GetPixelColor FreeImage_SetPixelColor 保存GIF FreeImage_OpenMultiBitmap FreeImage_SetMetadata FreeImage…

freeimage转到cvmat 单通道图像转到3通道[freeimage][cvmat]

0 结果 1 代码 将freeImage转为cv::mat&#xff0c;代码如下&#xff1a; #include <FreeImage.h> #include <opencv2\opencv.hpp> using namespace cv;// #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable : 4996) void FI2MAT(FIBITMAP* src, Mat&…

linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库

Linux(ubuntu系统)下使用FreeImage库 Linux(ubuntu系统)下使用FreeImage库 最近在搞一个图像处理的项目,需要用到FreeImage,之前在Windows下用过,很简单,因为FreeImage官网提供了可供使用的静态库动态库,直接包含就行了。现在需要在Linux平台下使用,发现官网并没有提供直…