算法编程:计算斐波那契数列

实现代码:C++

实现方法:通过递推法、递归法、矩阵快速幂方法

适用:

范围小且单次查询时,可以不用记忆化处理。

范围大或多次查询时,应使用记忆化处理。

时间复杂度:

递归法:O(n^2)-->递推法(动态规划):O(n)-->矩阵快速幂:O(nlgn)-->斐波那契数列公式:O(1)

目录

递推法:

递推法+记忆化:

递归法:

递归法+记忆化:

矩阵快速幂方法:

 斐波那契通项公式:

递推法:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	int x = 0;
	int y = 1;
	int ans;
	
	cin >> n;
	if(n == 0)ans = 0;
	
	else if(n = 1)ans = 1;
	else {
		for(int i = 2;i <= n;++ i)
		{
			ans = x + y;
			x = y;
			y = ans;
		}
	}
	
	cout << ans << endl;
	return 0;
}

递推法+记忆化:

#include<bits/stdc++.h>
using namespace std;
vector<int>f;


int main()
{
	int n;
	cin >> n;
	f.push_back(0);
	f.push_back(1);
	for(int i = 2;i <= n;++ i)
	{
		f.push_back(f[i-1]+f[i-2]);
	}
	for(int i = 1;i <= n;++ i)
	{
		cout << f[i] << endl;
	}
	return 0;
}

递归法:


  #include <iostream>
  using namespace std;
  
	  int fn(int n)
  {
	  //递归出口1
	  if(n==0)
	  return 0;
  
  //递归出口2
	  else if(n==1 )
	  return 1;
  
	  else
	  return fn(n-1)+fn(n-2); 
  }
  
  
  int main()
  {
	  
	  int n; 
	  int ans;
  
	  cin>>n;
  
	  ans=fn(n);
  
	  cout<<ans<<endl;
  }

递归法+记忆化:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll p = 1e9 + 7;
const int inf = 1e9,N = 1e5 + 3;
ll dp[N];

ll f(int n)
{
	if(n <= 2)return 1;
	if(dp[n] != -1)return dp[n];
	
	return dp[n] = (f(n - 1) + f(n - 2)) % p;
}


int main()
{
	memset(dp,-1,sizeof dp);
	int n;cin >> n;
	cout << f(n) << endl;
	
	return 0;
}

矩阵快速幂方法:

//计算斐波那契数列有很多种方法,而当阶数N很大时,矩阵快速幂算法是最佳的 
#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

const int mod=1e9+7;

class Matrix//矩阵类 
{
public:
	int row,col;//row为矩阵的行数,col为矩阵的列数 
	ull matrix[5][5];//矩阵 
	Matrix(int r=2,int c=2,int tag=0)//构造函数 
	{
		row=r;
		col=c;
		memset(matrix,0,sizeof(matrix));
		if(tag)//若传入tag为非0,则初始化为单位矩阵 
		{
			for(int i=0;i<min(r,c);i++)
			{
				matrix[i][i]=1;//对角线元素初始化为1 
			}    
		}    
	}        
};

Matrix operator *(Matrix m1,Matrix m2)//矩阵乘法,返回结果矩阵 
{
	Matrix ans;//构造一个2行2列的矩阵,初始化均为0 
	memset(ans.matrix,0,sizeof(ans.matrix));
	for(int i=0;i<m1.row;i++)//遍历第一个矩阵的每一行 
	{
		for(int j=0;j<m2.col;j++)//遍历第二个矩阵的每一列 
		{
			for(int k=0;k<m1.col;k++)//第一个矩阵的行与第二个矩阵的列一一对应相乘再相加 
			{
				ull tmp=m1.matrix[i][k]*m2.matrix[k][j]%mod; 
				ans.matrix[i][j]=(ans.matrix[i][j]+tmp)%mod;
			}
		}
	}
	return ans;
}

Matrix matrix_mul(Matrix m,ull power)//矩阵快速幂,求解矩阵m的power次幂 
//原理与普通快速幂相同,重载了矩阵相乘的函数之后可直接套用普通快速幂算法 
{
	Matrix ans(2,2,1);//初始化为单位矩阵 
	while(power)
	{    
		if(power&1)
		{
			ans=ans*m;
			power--;
		}
		power=power>>1;
		m=m*m;
	}
	return ans;
}

ull F(Matrix M,ull n)//计算N阶斐波那契数列 
{
	Matrix ans=matrix_mul(M,n);//计算矩阵M的N次幂 
	return ans.matrix[1][0];//取其右下角元素即为最终答案 
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T;
	cin>>T;
	Matrix M(2,2,0);
	//构造一个矩阵为{ {1,1} , {1,0} } 
	//N阶斐波那契数列等于该矩阵的N次幂的右上角/左下角元素 
	M.matrix[0][0]=M.matrix[0][1]=1;
	M.matrix[1][0]=1;
	M.matrix[1][1]=0;
	while(T--)
	{
		ull N;
		cin>>N;
		cout<<F(M,N)<<endl;
	}
	return 0;
}

 斐波那契通项公式:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三台电机的顺启逆停

1&#xff0c;开启按钮输入信号是 电机一开始启动&#xff0c;5秒回电机2启动 &#xff0c;在5秒电机三启动 关闭按钮输入时电机3关闭 &#xff0c;5秒后电机2关闭 最后电机一关闭 2&#xff0c;思路开启按钮按下接通电机1 并且接通定时器T0 定时器T0 到时候接通电机2 并且开…

YOLOV8逐步分解(3)_trainer训练之模型加载

yolov8逐步分解(1)--默认参数&超参配置文件加载 yolov8逐步分解(2)_DetectionTrainer类初始化过程 接上2篇文章&#xff0c;继续讲解yolov8训练过程中的模型加载过程。 使用默认参数完成训练器trainer的初始化后&#xff0c;执行训练函数train()开始YOLOV8的训练。 1. t…

windows下安装iteliij Idea2023.3

首先从官网下载 双击打开进行安装&#xff1a; 安装完成后&#xff0c;需要对Idea进行稍微处理下。使用我分享给大家的文件&#xff0c;操作以下步骤&#xff1a; 注意&#xff1a;不能打开IDEA软件。 进入到scripts中点击uninstall-all-users.vbs,最后点击确定。 接下来运行in…

如何成功找到理想的工作,java不行了吗?我靠这个方法成功拿到大厂10个offer

第一段&#xff1a;引言 作为一名即将毕业的大学生&#xff0c;步入职场是每个毕业生都要面对的现实挑战。随着社会竞争的日益激烈&#xff0c;如何成功找到一份理想的工作成为许多毕业生所关注的焦点。本文将分享一些关于毕业生求职的经验和建议&#xff0c;希望能够帮助毕业生…

图的遍历试题

一、单项选择题 01.下列关于广度优先算法的说法中&#xff0c;正确的是( ). Ⅰ.当各边的权值相等时&#xff0c;广度优先算法可以解决单源最短路径问题 Ⅱ.当各边的权值不等时&#xff0c;广度优先算法可用来解决单源最短路径问题 Ⅲ.广度优先遍历算法类似于树中的后序遍历算法…

C++中的动态内存管理

1.C中动态内存管理 C语言内存管理方式在C中可以继续使用&#xff0c;但有些地方就无能为力&#xff0c;而且使用起来比较麻烦&#xff0c;因此C又提出了自己的内存管理方式&#xff1a;通过new和delete操作符进行动态内存管理。 1.1 new/delete操作内置类型 c语言和c的动态内存…

Java_22 蓝桥杯真题——拼数

问题描述 给定几 个正整数 a1,a2....,an&#xff0c;你可以将它们任意排序, 现要将这 几 个数字连接成一排&#xff0c;即令相邻数字收尾相接&#xff0c;组成一个数。 问&#xff0c;这个数最大可以是多少。 输入格式 第一行输入个正整数 n(l < n< 20)。 第二行输入几 个…

Linux USB驱动(二)

1. Linux USB驱动软件框架 应用程序有两种访问硬件的途径&#xff1a;通过设备驱动程序来访问和跳过设备驱动程序&#xff08;直接使用host驱动程序&#xff09;来访问。 当直接使用Host驱动程序时&#xff0c;可以调用libusb库中已经封装好的函数接口。 2. USB电气信号 一个…

特征融合篇 | 利用RT-DETR的AIFI去替换YOLOv8中的SPPF(附2种改进方法)

前言:Hello大家好,我是小哥谈。RT-DETR模型是一种用于目标检测的深度学习模型,它基于transformer架构,特别适用于实时处理序列数据。在RT-DETR模型中,AIFI(基于注意力的内部尺度特征交互)模块是一个关键组件,它通过引入注意力机制来增强模型对局部和全局信息的处理能力…

2024全开源小狐狸ai付费创作系统V2.8.0

源码介绍 小狐狸GPT付费体验系统的开发基于国外很火的ChatGPT&#xff0c;这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更加准确地理解用户的意图&#xff0c;提供更加精准的答案。同时&#x…

从0开始搭建基于VUE的前端项目(三) Vuex的使用与配置

准备与版本 vuex 3.6.2(https://v3.vuex.vuejs.org/zh/)概念 vuex是什么? 是用作 【状态管理】的 流程图如下 state 数据状态,成员是个对象 mapState 组件使用this.$store.state.xxx获取state里面的数据 getters 成员是个函数,方便获取state里面的数据,也可以加工数据 ma…

HarmonyOS 应用开发之组件启动规则(Stage模型)

启动组件是指一切启动或连接应用组件的行为&#xff1a; 启动UIAbility、ServiceExtensionAbility、DataShareExtensionAbility&#xff0c;如使用startAbility()、startServiceExtensionAbility()、startAbilityByCall()等相关接口。 连接ServiceExtensionAbility、DataShare…

[BT]BUUCTF刷题第12天(3.31)

第12天 Basic BUU BURP COURSE 1 经过尝试&#xff0c;在这里X-Forwarded-For不管用&#xff0c;要用X-Real-IP BP抓包添加X-Real-IP:127.0.0.1&#xff08;注意这一行前面不要有空行&#xff09; 发送后返回提示了用户名和密码&#xff0c;这里直接给了&#xff0c;登录即可…

unity学习(78)--unity调试--长痛不如短痛

1.在vs2022中&#xff0c;工具--获取工具与功能。 2. 安装图中工具&#xff0c;原来我早就安装了。 3 f9下断 同时点击图中按钮 vs此时变为如下状态 unity中出现如下提示&#xff1a; 4 在unity中运行游戏&#xff0c;vs这边确实成功断住了&#xff01;

【千帆杯】K12教育常规赛 北京场线下交流会心得

千帆杯K12教育常规赛 北京场线下交流会心得 ​ 周日有幸参加了 百度智能云千帆AppBuilder北京场线下交流会 ( 活动链接 )&#xff0c;去线下组队创作了 K12教育 相关的智能体。参赛过程中认识了不少大佬与朋友&#xff0c;抱大佬队友的腿&#xff0c;他的 猜成语 应用获得了线…

【详细讲解WebView的使用与后退键处理】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

前端三剑客 —— CSS (第二节)

目录 内容回顾&#xff1a; CSS选择器*** 属性选择器 伪类选择器 1&#xff09;:link 超链接点击之前 2&#xff09;:visited 超链接点击之后 3&#xff09;:hover 鼠标悬停在某个标签上时 4&#xff09;:active 鼠标点击某个标签时&#xff0c;但没有松开 5&#xff09;:fo…

TypeScript-自动编译

1.生成文件 tsc --init 2.修改配置文件 说明&#xff1a;通过CTRLF搜索到以下单词&#xff0c;进行修改。 "strict": true, //是否开启严格模式 "outDir": "./outFile", //表示ts文件最终编译为js文件&#xff0c;js文件存放的位置 3.新…

JavaScript异步编程规范->实现一个简易版本的 Promise

文章目录 1.Promise基本使用2.实现一个Promise2.1.resolve/reject2.1.1.初始化状态及返回值2.1.2.实现resolve/reject2.1.3.状态不可逆2.1.4.处理throw 2.2.then2.2.1.实现then2.2.2.通过队列实现setTimeout2.2.3.链式调用2.2.4.执行顺序 2.3.其他方法2.3.1.all2.3.2.race2.3.3…

量化交易入门(三十四)DMI指标学习和应用

什么是DMI指标 DMI(Dynamic Momentum Index)指标是一种趋势型指标,由威尔斯威尔德(Welles Wilder)于1978年提出。它通过比较价格的正向和负向变动幅度来衡量市场趋势的强度和方向。 DMI指标由三部分组成: DI(Positive Directional Indicator):衡量价格上涨趋势的强度。-DI(N…