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

实现代码: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){//递归出口1if(n==0)return 0;//递归出口2else if(n==1 )return 1;elsereturn 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;
}

 斐波那契通项公式:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Meme币如何赋能Web3社交?

Meme 币正在迎来它的高光时刻。然而究其本质&#xff0c;在过去四年中&#xff0c;我们在 Crytpo 世界中所见证的只不过是一些相同的理念在不同的新媒介中的实现。例如社交代币、NFT 或者 Meme 币。它们的共同特征都是让那些共享的想法、资产或信息的金融化成为可能。参与这些市…

【AI学习指南】十、PyTorch-简洁、高效、易用的深度学习框架和简单使用

目录 简介 为什么说PyTorch节省算力 简单使用 安装 创建模型实例

【保姆级教程】YOLOv3图像目标检测:训练自己的数据集

一、YOLOv3图像目标检测原理 二、YOLOv3代码及预训练权重下载 2.1 下载yolov3代码 这里使用的是B站大佬Bubbliiiing复现的yolov3代码 仓库地址&#xff1a; https://github.com/bubbliiiing/yolo3-pytorch 2.2 下载模型预训练权重unet_resnet_medical.pth 链接&#xff1a…

【博弈论3——二人博弈的纳什均衡】

1.俾斯麦海之战 2. 零和博弈的定义 零和博弈&#xff08;Zero-Sum Game&#xff09;是一种博弈论的基本概念&#xff0c;指的是在博弈过程中&#xff0c;博弈参与者之间的收益和损失之和总是一个常数&#xff0c;特别是总和为零。即博弈一方的收益必然等于另一方的损失&#x…

贪吃蛇:从零开始搭建一个完整的小游戏

目录 导语&#xff1a; 一、游戏框架 二、蛇的实现 三、绘制游戏界面 四、食物 五、移动蛇 六.得分系统&#xff0c;是否吃到食物 七、检查碰撞 八、处理按键事件 九、得分系统 十、游戏状态管理 导语&#xff1a; 贪吃蛇这个经典的小游戏&#xff0c;我上学的时候就…

QT记事本

QT记事本 1.概述 2.界面  2.1 界面布局  2.2 UI美化stylesheet   2.2.1 准备   2.2.2 stylesheet   2.2.3 效果 2.3 窗口大小调整与子控件自适应 3.信号与槽  3.1 简述  3.2 信号与槽设置   3.2.1 UI控件设置   3.2.2 UI转到槽&#xff08;自动连接&am…

Jamba LLM模型:破解大型上下文窗口挑战的AI新星

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

JBPM学习(三):管理流程定义,java集合面试题

Test public void findAll() { // 查询 List list processEngine.getRepositoryService()// .createProcessDefinitionQuery()// .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//排序条件 //.count()查询出总数量 //.page(0, 100)分页&#xff0c;取出前100条记录 …

flask-(数据连接池的使用,定制命令,信号的使用,表关系的建立和查询)

文章目录 连接池实例flask定制命令flask 缓存的使用flask信号的使用sqlalchemy原生操作sqlalchemy操作表flask orm操作表一对多的增加和跨表查询 &#xff08;一对一只需要关联字段加上 ,uniqueTrue&#xff09;多对多关系的增加和查询多对多基本的增删改查 连接池 import pymy…

axios封装,请求取消和重试,请求头公共参数传递

axios本身功能已经很强大了&#xff0c;封装也无需过度&#xff0c;只要能满足自己项目的需求即可。 常规axios封装&#xff0c;只需要设置&#xff1a; 实现请求拦截实现响应拦截常见错误信息处理请求头设置 import axios from axios;// 创建axios实例 const service axios…

Qt主窗口 之:状态栏(QStatusBar)

成员函数 原文链接&#xff1a;https://blog.csdn.net/techenliu/article/details/133687883 1&#xff09;void setText(const QString &text) 设置状态栏的文本。参数text是要显示的消息文本。 2&#xff09;QString text() const 返回当前状态栏的文本。 3&#xff0…

【漏洞复现】WordPress Plugin LearnDash LMS 敏感信息暴漏

漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin LearnDash LMS 4.10.2及之前版本存在安全漏洞&#x…

The Morning Star

题目描述 本题有多组数据。 给定 n 个点&#xff0c;第 i 个点的坐标为 xi​&#xff0c;yi​。 现需要将星星和指南针放在任意两个点上&#xff0c;使得星星在指南针的正北、正东、正西、正南、正东南、正东北、正西南或正西北方向&#xff0c;求一共几种放法。&#xff08…

遥感动态监测技术

很多人对动态监测和动态检测两个名词有疑惑。我们可以这样理解&#xff0c;动态监测是一个广义的名词&#xff0c;泛指数据预处理、变化信息发现与提取、变化信息挖掘与应用等&#xff0c;以对整个流程的叙述。动态检测是一个狭义的名词&#xff0c;主要指部分数据预处理、变化…

C++list的模拟实现

为了实现list&#xff0c;我们需要实现三个类 一、List的节点类 template<class T> struct ListNode {ListNode(const T& val T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val; }; 二、List的迭代器…

JAVAEE之CSS

1.CSS 是什么&#xff1f; 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. 1.1 CSS和HTML的区别 CSS&#xff0c;全称为层叠样式表(Cascading Style Sheets)&#xff0c;是…

RocketMQ(版本4.9.4)+RocketMQ_Dashbord环境搭建(生产者、消费者的前置环境搭建)

一、官方网站下载 RocketMQ源码包 https://rocketmq.apache.org/zh/docs/4.x/introduction/02quickstart 二、把rocketMQ上传到Linux环境下解压&#xff0c;编译&#xff0c;执行以下命令&#xff08;需要提前装jdk和maven并配置好环境变量&#xff09; unzip rocketmq-all-4…

学习java第二十九天

如何通过注解配置文件&#xff1f; Configuration 用于指定当前类是一个 spring 配置类&#xff0c;当创建容器时会从该类上加载注解&#xff0c;value 属性用于指定配置类的字节码。 ComponentScan 用于指定 Spring 在初始化容器时要扫描的包。basePackages 属性用于指定要扫…

AtCoder Beginner Contest 347 (ABCDEF题)视频讲解

A - Divisible Problem Statement You are given positive integers N N N and K K K, and a sequence of length N N N, A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\ldots,A_N) A(A1​,A2​,…,AN​). Extract all elements of A A A that are multiples of K K K, divi…