【蓝桥杯速成】| 4.递归

递归

 题目一:最大公约数

问题描述

1979. 找出数组的最大公约数 - 力扣(LeetCode)

给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。

两个数的 最大公约数 是能够被两个数整除的最大正整数。

解题步骤

需要返回数组中最大最小值的最大公约数

那么首先需要求出最大最小值

可以使用for循环遍历得到

int minnum=INT_MAX,maxnum=INT_MIN;
for(int i=0;i<nums.size();i++){if(nums[i]<minnum){minnum=nums[i];}if(nums[i]>maxnum){maxnum=nums[i];}
}

当然也可以使用

求最大值和最小值的函数

  1. 最大值std::max_element

  2. 最小值std::min_element

这些函数返回的是指向最大值或最小值的迭代器,因此需要通过解引用操作符 * 来获取具体的值。

int maxnum=*max_element(nums.begin(),nums.end());
int minnum=*min_element(nums.begin(),nums.end());

 接下来就是求最大公约数

根据数学知识,我们可以使用辗转相除法

 那么很明显这是个递归过程,每次要求的是较大值除以较小值的余数,

终止条件就是余数为零,代表整除

所以求最大公倍数的函数应该是

int GCD(int maxnum,int minnum){if(maxnum%minnum == 0)return minnum;else return GCD(minnum,maxnum%minnum);
}

 最后只需要在主函数中调用即可,完整代码在下面!

补充说明:C++的标准库中有计算两个整数最大公约数的函数,就叫gcd,可以直接调用,但此处想强调的是最基础的递归逻辑,故手动实现了一把!

code

class Solution {
public:int GCD(int maxnum,int minnum){if(maxnum%minnum == 0)return minnum;else return GCD(minnum,maxnum%minnum);}int findGCD(vector<int>& nums) {// int minnum=INT_MAX,maxnum=INT_MIN;// for(int i=0;i<nums.size();i++){//     if(nums[i]<minnum){//         minnum=nums[i];//     }//     if(nums[i]>maxnum){//         maxnum=nums[i];//     }// }int maxnum=*max_element(nums.begin(),nums.end());int minnum=*min_element(nums.begin(),nums.end());return GCD(maxnum,minnum);}
};


题目二:FJ的字符串

问题描述

FJ在沙盘上写了这样一些字符串:
  A1 = “A”
  A2 = “ABA”
  A3 = “ABACABA”
  A4 = “ABACABADABACABA”
  … …
  你能找出其中的规律并写所有的数列AN吗?

输入格式

仅有一个数:N ≤ 26。

输出格式

请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

样例输入

3

样例输出

ABACABA

解题步骤

观察这些字符串,不难发现

  A1 = “A
  A2 = “ABA
  A3 = “ABACABA
  A4 = “ABACABADABACABA

整体规律就是:AN=A(N-1)+第N号字母+A(N-1)

那么也可以用递归方法实现

直接利用找到的规律写出代码即可,注意字符转化

code

#include<bits/stdc++.h>
using namespace std;
string FJ(int N){if(N==1){return "A";}else{return FJ(N-1)+(char)('A'+N-1)+FJ(N-1);}
}
int main(){int N;cin>>N;cout<<FJ(N);return 0;
} 

题目三:递归实现指数型枚举

问题描述

从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

        输入一个整数n。

输出格式

        每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。各行(不同方案)之间的顺序任意。

数据范围

        1 ≤ n ≤ 15

示例

        输入 :3

        输出:1,12,13,123,2,23,3

        输入 :4

        输出:1,12,13,14, 123,134, 1234, 2,23,24, 234, 3, 34, 4

解题步骤

观察题目和示例,可以看到这个n既是输出的最大长度,也是所取数字的最大值

组合成的每一个数字实际上有重复关系,使用递归法

观察输出,实际上是对1~n中每个数字的选与不选

即取n时与取n-1时的区别在于增加了n这个数字所组成的组合(单层递归)

	dfs(index+1,n,current);//不选择该数字 ,即n-1产生的所有答案current.push_back(index);//index加入该数字 dfs(index+1,n,current);//生成新的组合 

规定同一行的数必须升序排列,那么第一个元素的大小还决定了该行答案出现数字的下界,并且第一个元素是从1,2,3,,,n

那么递归的终止条件为

	if(index>n){for(int i=0;i<current.size();i++){cout<<current[i]<<" ";}cout<<endl;return;}

 dfs具备以上两个主要部分后,只剩下确定参数啦

n作为上界是必须一直使用的,index作为下界需要在传递过程中改变,答案数组current也需要传递使用

那么整个函数的定义为void dfs(int index,int n,vector<int> current){

在主函数中完善输入,调用函数即可实现该题

code

#include<bits/stdc++.h>
using namespace std;
void dfs(int index,int n,vector<int> current){if(index>n){for(int i=0;i<current.size();i++){cout<<current[i]<<" ";}cout<<endl;return;}dfs(index+1,n,current);//不选择该数字 current.push_back(index);//index加入该数字 dfs(index+1,n,current);//生成新的组合 
}int main(){int n;cin>>n;vector<int> current;dfs(1,n,current);return 0;
}

题目四:递归实现排列型枚举

问题描述

1-n个这 n 个整数拍成一排并打乱次序,输出所有可以选择的方案。

示例

        输入:3

        输出:

        123

        132

        213

        231

        312

        321

解题步骤

这个题目如果直接用笔算的话,可以看成是三个格子的填空游戏

从1开始作为第一位,再从余下的数字选择填入,是全排列

利用递归解决还是需要3步走

确定终止条件

如果第一位大于n那么结束,并输出该序列

    if(i>n){for(int j=1;j<=n;j++){cout<<s[j]<<" ";}cout<<endl;return;}

按顺序给1,2,3,4,,,n这n个数字一个当老大的机会,并逐步确定后面的小弟队伍

注意记录每一位小弟的排队情况(即有无使用过)

排进去后进行下一位,

递归完毕后会开启新一轮,需要恢复当前值和当前结果数组的使用情况(下一轮重新开始还得用呢!)

    for(int j=1;j<=n;j++){if(!used[j]){//该数字没有被使用过 s[i]=j;//记录该数字 used[j]=true;//更新记录情况dfs(i+1);//进行下一轮 used[j]=false;//回溯 s[i]=0;//清空 }}

 那么这个dfs的参数就比较简单了,只需要传入n即可void dfs(int i)

code

#include<iostream>
using namespace std;const int N=10;
int n;
bool used[N];//记录数字是否用过 
int s[N];//保存方案 
void dfs(int i){if(i>n){for(int j=1;j<=n;j++){cout<<s[j]<<" ";}cout<<endl;return;}for(int j=1;j<=n;j++){if(!used[j]){//该数字没有被使用过 s[i]=j;//记录该数字 used[j]=true;//更新记录情况dfs(i+1);//进行下一轮 used[j]=false;//回溯 s[i]=0;//清空 }}
}
int main(){cin>>n;dfs(1);return 0;
}

题目五:递归实现组合型枚举

问题描述

1-n个数字中随机选取 m 个,每种方案按照里的数字按照从小到大的顺序排列,按照字典序输出。

示例

        输入:5 3

        输出:

        123

        124

        125

        134......

        345

解题步骤

这题不一样之处在于它多了个m,由两个值决定取值范围,取值个数

思路还是一样的

先写出终止条件,如果当前数大于最大取值个数m,输出当前序列

	if(now>m){for(int i=1;i<=m;i++){cout<<s[i]<<" ";}cout<<endl;return;} 

 单层递归呢就是,从当前遍历到的数字一直到n中,遍历选择,存入s中,再取下一位

	for(int i=start;i<=n;i++){//可用范围内随意挑选 s[now]=i;dfs(now+1,i+1);s[now]=0;}

 那么函数的参数需要当前值和开始值void dfs(int now,int start)

除此以外该函数可以再加一个剪枝操作,不做无用功

if(now+n-start<m)    return;//不够用

同样在主函数中进行输入和传参调用即可

code

#include<iostream>
using namespace std;
const int N=35;
int n,m;
int s[N];
void dfs(int now,int start){if(now+n-start<m)	return;//不够用if(now>m){for(int i=1;i<=m;i++){cout<<s[i]<<" ";}cout<<endl;return;} for(int i=start;i<=n;i++){//可用范围内随意挑选 s[now]=i;dfs(now+1,i+1);s[now]=0;}
}
int main(){cin>>n>>m;dfs(1,1);return 0;
}

练习题!

我在速成蓝桥杯大神,你也来练一道吧!点击下方连接加入,为我砍一题!

 P8707 [蓝桥杯 2020 省 AB1] 走方格 - 洛谷

【蓝桥杯真题】 | 走方格(2020省赛)-CSDN博客

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

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

相关文章

当大模型训练遇上“双向飙车”:DeepSeek开源周 DualPipe解析指南

前言 在大模型训练中&#xff0c;传统流水线并行因单向数据流和通信延迟的限制&#xff0c;导致GPU利用率不足60%&#xff0c;成为算力瓶颈。DeepSeek团队提出的DualPipe双向流水线架构&#xff0c;通过双向计算流与计算-通信重叠的创新设计&#xff0c;将前向与反向传播拆解为…

蓝桥杯好题推荐---前缀和

&#x1f308;个人主页&#xff1a; 羽晨同学-CSDN博客 &#x1f4ab;个人格言:“成为自己未来的主人~” 题目链接 【模板】前缀和https://ac.nowcoder.com/acm/problem/226282 解题思路 这种题目是要求我们找到一个数组中从l到r的元素的和&#xff0c;查询Q次&#xff0c;…

Nginx快速上手

什么是nginx Nginx 是一款开源的高性能 HTTP 和反向代理服务器&#xff0c;同时也提供了 IMAP/POP3/SMTP 代理功能。它由俄罗斯程序员 Igor Sysoev 于2004年首次发布&#xff0c;最初设计目的是为了解决 C10k 问题&#xff0c;即如何让单台服务器同时处理1万个并发连接的问题。…

【C++】:STL详解 —— 布隆过滤器

目录 布隆过滤器的概念 布隆过滤器的优点 布隆过滤器的缺点 布隆过滤器使用场景 布隆过滤器的实现 布隆过滤器的概念 布隆过滤器&#xff08;Bloom Filter&#xff09; 是一种空间效率极高的概率型数据结构&#xff0c;用于快速判断一个元素是否属于某个集合。其核心特点…

从Instagram到画廊:社交平台如何改变艺术家的展示方式

从Instagram到画廊&#xff1a;社交平台如何改变艺术家的展示方式 在数字时代&#xff0c;艺术家的展示方式正在经历一场革命。社交平台&#xff0c;尤其是Instagram&#xff0c;已经成为艺术家展示作品、与观众互动和建立品牌的重要渠道。本文将探讨社交平台如何改变艺术家的…

MySQL(事物上)

目录 示例&#xff1a; 一 引入事物 1. 概念 2. 事物的4大特性 3. 为什么要有事物&#xff1f; 二 事物操作 1. 查看存储引擎支持的事物 2. 事物的提交方式 2.1 查看事物的默认提交方式 2.2 设置事物的默认提交方式 2.3 查看事物的全局隔离级别 2.4 验证事物的回滚…

Spring Boot 实现多数据源配置

一、配置流程 在 Spring Boot 中实现多数据源配置通常用于需要连接多个数据库的场景。主要有以下几个步骤&#xff1a; 配置多个数据源的连接信息。定义多个数据源的 Bean。为每个数据源配置MyBatis的SqlSessionFactory和事务管理器。为每个数据源定义Mapper接口和Mapper XML…

p5.js:绘制各种内置的几何体,能旋转

向 豆包 提问&#xff1a;请编写 p5.js 示例&#xff0c; 绘制各种内置的几何体&#xff0c;能让这些几何体缓慢旋转。 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . 此代码创建了一个包含多个内置几何体的 3D 场景&#xff0c;每个几何体都有不同的颜色和位置。运行代…

结构体定义与应用

引言 到今天为止,c语言的基础操作和基础数据类型,就都已经结束了,大家都知道,如果要实现复杂的功能,大家都可以通过函数封装调用,那么如果要实现基础数据类型的封装,该怎么办呢?答案就是结构体。 在C语言编程中,结构体(struct)是非常重要的一个概念,它为程序员提供…

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架&#xff0c;通过合成自挑战问题来增强视觉-语言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练&#xff0c;显著提升了模型在推理深度和广度上的表…

R语言零基础系列教程-01-R语言初识与学习路线

代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境&#xff0c;是一门用于统计计算和作图的语言。“一切皆是对象”&#xff0c;数据、函数、运算符、环境等等都是对象。易学&#xff0c;代码像伪代码一样简洁&#xff0c;可读性高强大的统计和可视…

PythonWeb开发框架—Flask-APScheduler超详细使用讲解

1.定时任务的两种实现方式 1.1 用scheduler.task装饰任务 安装插件&#xff1a; pip install Flask-APScheduler pip install apscheduler 脚本实现&#xff1a; ###app.py##导入依赖库 from flask import Flask import datetime import config from flask_apscheduler i…

python_巨潮年报pdf下载

目录 前置&#xff1a; 步骤&#xff1a; step one: pip安装必要包&#xff0c;获取年报url列表 step two: 将查看url列表转换为pdf url step three: 多进程下载pdf 前置&#xff1a; 1 了解一些股票的基本面需要看历年年报&#xff0c;在巨潮一个个下载比较费时间&…

从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(2)消息队列与消息中间件

文章大纲 原始视频队列Python 内存视频缓存优化方案(4GB 以内)一、核心参数设计二、内存管理实现三、性能优化策略四、内存占用验证五、高级优化技巧六、部署建议检测结果队列YOLO检测结果队列技术方案一、技术选型矩阵二、核心实现代码三、性能优化策略四、可视化方案对比五…

React Native 如何使用 Expo 快速开发?

React Native是当下热门的跨平台移动开发框架&#xff0c;而Expo则是它的重要开发工具之一。Expo提供了一套完整的开发环境&#xff0c;使开发者无需安装Android Studio或Xcode也能快速运行React Native项目。它包含了众多内置API&#xff0c;如相机、地理位置、推送通知等&…

中考英语之09从句

1 宾语从句 定义 在主从复合句中充当宾语&#xff0c;位于及物动词、介词或复合谓语之后的从句。 引导词 综述&#xff1a; that&#xff08;可省略&#xff09;、if/whether、连接代词&#xff08;what、which、who、whom、whose 等&#xff09;和连接副词&#xff08;when、…

平方矩阵问题

Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…

C++模版(复习)

1.泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础 2.函数模板的格式 template<typename T1,typename T2,…,typename Tn> 返回类型 函数名(参数列表) {   //函数体 } 3.template<class T1,class T2,…,class…

【sklearn 05】sklearn功能模块

sklearn功能模块 分类&#xff1a;识别某个对象属于那个类别回归&#xff1a;预测与对象相关联的连续值属性聚类&#xff1a;将相似对象自动分组降维&#xff1a;减少要考虑的随机变量的数量模型选择&#xff1a;比较、验证、选择参数和模型预处理&#xff1a;特征提取和归一化…

使用Qt创建悬浮窗口

在Qt中创建悬浮窗口&#xff08;如无边框、可拖动的浮动面板或提示框&#xff09;可以通过以下方法实现。以下是几种常见场景的解决方案&#xff1a; 方法1&#xff1a;使用无边框窗口 鼠标事件拖动 适用于自定义浮动工具窗口&#xff08;如Photoshop的工具栏&#xff09;。 …