ACM程序设计课内实验(5)递归

前言

定义:自己调用自己(需要调用栈来执行)
两个基本要素:边界条件(何时结束)和 递归模式(大问题如何转化为小问题)
关键:根据递推关系式写程序(用数学归纳法证明)
注意:递归算法在数据量特别大的时候会出现段错误(例如:递归运算100000000!时)

1.汉诺塔-递归

Description

从前有一座庙,庙里有三个柱子,柱A柱 B柱 C。柱A有64个盘子,从上往下盘子越来越大。要求庙里的老和尚把这64个盘子全部移动到柱子C上。移动的时候始终只能小盘子压着大盘子。而且每次只能移动一个。
现在问题来了,老和尚相知道将柱A上面前n个盘子从柱A搬到柱C搬动方法。要求移动次数最少。

Input

输入有多组,每组输入一个正整数n(0<n<16)

Output

每组测试实例,输出每一步的步骤,输出“number..a..form..b..to..c”。表示将第a个盘子从柱b搬到柱c.

Sample Input

2

Sample Output

number..1..form..A..to..B
number..2..form..A..to..C
number..1..form..B..to..C

Hint

#include <iostream>using namespace std;void hanoi(int n, char A, char B, char C) {if (n == 1) {printf("number..%d..form..%c..to..%c\n",n, A, C);} else {hanoi(n - 1, A, C, B);printf("number..%d..form..%c..to..%c\n",n, A, C);hanoi(n - 1, B, A, C);}
}int main() {int n;ios::sync_with_stdio(false);while (scanf("%d", &n) != EOF) {hanoi(n, 'A', 'B', 'C');}return 0;
}

2.幂次方-递归

Description

任何一个正整数都可以用2的幂次方表示。例如
137=2^7+2^3+2^0 
由此可知,137可表示为:
2(7)+2(3)+2(0)
而7又可以表示为:2(2)+2+2(0)
3可以表示为:2+2(0)
因此137最终表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)

Input

一个正整数n(n≤20000)。

Output

符合约定的n的0,2表示(在表示中不能有空格)

Sample Input

1315

Sample Output

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
#include <iostream>
using namespace std;// 递归函数,将正整数n表示为2的幂次方的形式
void dfs(int n) {if (n == 0) { // 如果n为0,表示已经表示完成,直接返回return;}if (n == 1) { // 如果n为1,表示2^0,直接输出2(0)cout << "2(0)";return;}if (n == 2) { // 如果n为2,表示2^1,直接输出2cout << "2";return;}int k = 0, t = n;// 计算n可以表示为2的几次幂while (t > 1) {t /= 2;k++;}if (k == 1) { // 如果k为1,表示2^1,直接输出2cout << "2";} else {cout << "2("; // 否则输出2(,表示2的幂次方dfs(k); // 递归计算k的2的幂次方表示cout << ")"; // 输出)}if (n - (1 << k) > 0) { // 如果n减去2^k后大于0,表示还有余数需要继续表示cout << "+"; // 输出+dfs(n - (1 << k)); // 递归计算n减去2^k后的表示}
}int main() {int n;cin >> n; // 输入正整数ndfs(n); // 调用递归函数表示n的2的幂次方形式cout << endl;return 0;
}

 3.数的计算-递归

Description

我们要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n≤500),然后对此自然数按照如下方法进行处理:1、不作任何处理;2、在它的左边加上一个自然数,但该自然数不能超过原数的一半;3、加上数后,继续按此规则进行处理,直到不能再加自然数为止.

Input

1个自然数n(n≤500)

Output

1个整数,表示具有该性质数的个数。

Sample Input

6

Sample Output

6

Hint

满足条件的数为
6,16,26,126,36,136

Source

洛古
#include <bits/stdc++.h>
using namespace std;
int num=0;
int dfs(int n)
{for(int i=1; i<=n/2; i++){num++;dfs(i);}return 0;
}
int main()
{int n;cin>>n;dfs(n);cout<<num+1<<endl;return 0;
}

 4.数的计算加强版-递推

Description

我们要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n≤10000),然后对此自然数按照如下方法进行处理:1、不作任何处理;2、在它的左边加上一个自然数,但该自然数不能超过原数的一半;3、加上数后,继续按此规则进行处理,直到不能再加自然数为止.

Input

1个自然数n(n≤10000)

Output

1个整数,表示具有该性质数的个数。(64位的整数范围)

Sample Input

6

Sample Output

6
例子二:
输入:10
输出:14

Hint

对于例子一满足条件的数为
6,16,26,126,36,136

Source

洛古
#include <bits/stdc++.h>
using namespace std;long long a[10001]; // 定义一个数组a,用来存储具有指定性质的数的个数int main() {int n;cin >> n; // 输入自然数na[0] = a[1] = 1; // 初始化a[0]和a[1]为1,表示0和1都满足条件for (int i = 1; i <= n; i++) { // 从1到n中遍历每个自然数if (i & 1) { // 如果i为奇数,说明不能加自然数,直接继承前一个数的结果a[i] = a[i - 1];} else { // 如果i为偶数,可以加上前面的数或者前面的数除以2a[i] = a[i - 1] + a[i / 2];}}cout << a[n] << endl; // 输出具有指定性质的数的个数return 0;
}

5.数字分段-递归

Description

给你N个正整数,把这些正整数分成一些段,顺序不能乱,每段的数字和最大为K;请你输出每段的开始下标和结束下标;前面的段和尽量小(也就是后面的和尽量大);

Input

第一行输入N和K,(1<=n,k<=1000);
第二行是这n个数a[i],(1<=a[i]<=100);
k大于任意a[i];

Output

输出每段的起点和终点的下标(从1开始);

Sample Input

6 20
1 6 5 10 15 20

Sample Output

1 2
3 4
5 5
6 6

这是一个贪心算法的问题,我们可以从左到右遍历数组,每次尽可能多地取数,直到当前段的和大于K。然后输出当前段的开始下标和结束下标,接着从下一个位置重新开始计算新的段。0 

#include <bits/stdc++.h>
using namespace std;int a[100];
int n, k;// 递归函数,用于查找每个段的起点和终点下标
int dfs(int r, int l) {int s = 0;for (int i = r; i >= l; i--) {s += a[i];if (s > k) {dfs(i, l); // 递归调用,查找下一个段的起点和终点下标cout << i + 1 << " " << r << endl; // 输出当前段的起点和终点下标return 0;}}cout << 1 << " " << r << endl; // 输出最后一个段的起点和终点下标
}int main() {cin >> n >> k; // 读取输入的N和Kfor (int i = 1; i <= n; i++)cin >> a[i]; // 读取输入的N个正整数a[i]dfs(n, 1); // 调用递归函数,从最后一个数字开始查找每个段的起点和终点下标return 0;
}

 6.FBI树-递归

Description

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:1) T的根结点为R,其类型与串S的类型相同;2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S_1 和S_2	 ;由左子串S_1 构造R的左子树T_1,由右子串S_2 构造R的右子树T_2。现在给定一个长度为2^N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

Input

第一行是一个整数N(0≤N≤10),第二行是一个长度为2^N 的“01”串。

Output

一个字符串,即FBI树的后序遍历序列。

Sample Input

3
10001011

Sample Output

IBFBBBFIBFIIIFF

 解析:首先需要根据输入的字符串长度N,计算出字符串的长度为2^N。然后根据题目要求,构造一棵FBI树,并输出它的后序遍历序列。

#include <iostream>
#include <string>
using namespace std;// 递归构造FBI树的函数
void dfs(string s, int start, int end) {// 当子串长度为1时,根据字符输出对应的B结点或I结点if (start == end) {if (s[start] == '0') {cout << "B";} else {cout << "I";}} else {// 将子串分为左右两部分int mid = (start + end) / 2;// 递归构造左右子树dfs(s, start, mid);dfs(s, mid + 1, end);// 统计左右子树中0和1的个数int count0 = 0, count1 = 0;for (int i = start; i <= end; i++) {if (s[i] == '0') {count0++;} else {count1++;}}// 根据左右子树的类型输出当前结点的类型if (count0 == 0 && count1 > 0) {cout << "I";} else if (count1 == 0 && count0 > 0) {cout << "B";} else {cout << "F";}}
}int main() {int n;string s;cin >> n >> s;// 从根节点开始递归构造FBI树并输出后序遍历序列dfs(s, 0, (1 << n) - 1);cout << endl;return 0;
}

 7.数的划分-递归

Description

将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7k=3,下面三种分法被认为是相同的。
1 1 5
1 5 1
5 1 1
问有多少种不同的划分方法?

Input

输入 n,k(n<=200, 2<=k<=6)

Output

一个整数,划分的方法!

Sample Input

7 3

Sample Output

4

Hint

四种分法为:
1,1,5;
1,2,4;
1,3,3;
2,2,3.
#include <iostream>
using namespace std;int countPartitions = 0;// 递归计算整数n分成k份的不同划分方法
void dfs(int n, int k, int start, int count, int sum) {// 当划分数达到k时,如果sum等于n,则找到一种划分方法if (count == k) {if (sum == n) {countPartitions++;}return;}// 从start开始尝试不同的划分for (int i = start; i <= n - sum; i++) {dfs(n, k, i, count + 1, sum + i);}
}int main() {int n, k;cin >> n >> k;dfs(n, k, 1, 0, 0);cout << countPartitions << endl;return 0;
}

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

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

相关文章

java-集合

什么是算法和数据结构 【1】算法&#xff1a; &#xff08;1&#xff09;可以解决具体问题 :例如 1234。。。99100 解题流程算法 &#xff08;2&#xff09;有设计解决的具体的流程 算法1&#xff1a; 123 336 6410.....加到100 --》5050 算法2&#xff1a;(1100)*5…

Python 自动化之批量处理文件(一)

批量新建目录、文档Pro版本 文章目录 批量新建目录、文档Pro版本前言一、做成什么样子二、基本思路1.引入库2.基本架构 三、用户输入模块四、数据处理模块1.excel表格数据获取2.批量数据的生成 总结 前言 我来写一个不一样的批量新建吧。在工作中&#xff0c;有些同学应该会遇…

MySQL全文索引

MySQL全文索引是MySQL中提供的一种基于全文索引的搜索功能&#xff0c;主要用于在InnoDB或MyISAM表中搜索信息。 创建全文索引 创建全文索引使用FULLTEXT关键字。你可以在创建表时添加全文索引&#xff0c;或者通过修改已有表结构添加全文索引。 在创建表时添加全文索引&…

css 使用flex 完成瀑布流布局

瀑布流布局在商城类、文章类 app、网页中都是常用的&#xff0c;使用这样的形式&#xff0c;能过让整个页面更加的活波&#xff0c;也能让图片根据实际的大小来显示&#xff0c;更好的展示图片内容。那么代码如何实现呢 实现的效果 代码 <template><view class"…

登录/验证码/注册

登录 pom文件 <!--hutool工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency><!--jwt--><dependency><groupId>io.jsonw…

【解决】Windows 11检测提示电脑不支持 TPM 2.0(注意从DTPM改为PTT)

win11升级&#xff0c;tpm不兼容 写在最前面1. 打开电脑健康状况检查2. 开启tpm3. 微星主板AMD平台开启TPM2.0解决电脑健康状况检查显示可以安装win11&#xff0c;但是系统更新里显示无法更新 写在最前面 我想在台式电脑上用win11的专注模式&#xff0c;但win10不支持 1. 打…

基于自动化脚本批量上传依赖到nexus内网私服

前言 因为某些原因某些企业希望私服是不能连接外网的&#xff0c;所以需要某些开源依赖需要我们手动导入到nexus中&#xff0c;尽管nexus为我们提供了web页面。但是一个个手动导入显然是一个庞大的工程。 对此我们就不妨基于脚本的方式实现这一过程。 预期效果 笔者本地仓库…

window.location.href的用法大全

window.location.href的用法大全 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一起探讨前端开发中常用的一个关键技术——window.location.href。这是一个在Web开发中频繁使用…

在Node.js中MongoDB插入数据的方法

本文主要介绍在Node.js中MongoDB插入数据的方法。 目录 Node.js中MongoDB插入数据使用MongoDB原生驱动插入数据使用Mongoose插入数据 Node.js中MongoDB插入数据 在Node.js中&#xff0c;可以使用MongoDB原生驱动或Mongoose库来连接和操作MongoDB数据库。 以下是在Node.js中使用…

爬取图片python代码

在百度上爬取图片 pic_baidu.py import re import requests from urllib import error from bs4 import BeautifulSoup import os num 0 numPicture 0 file List []def Find(url, A):global Listprint(正在检测图片总数&#xff0c;请稍等.....)t 0i 1s 0while t <…

电子印章法律风险点及安全防范措施

公章是公司处理内外部事务的印鉴&#xff0c;公司对外的正式信函、文件、报告使用公章&#xff0c;盖了公章的文件具有法律效力。公章由公司的法定代表人执掌&#xff0c;法定代表人如果把法定代表人章与公章一同使用就代表公司行为。 随着社会数字化转型&#xff0c;电子印章及…

持续集成交付CICD:CentOS 7 安装SaltStack

目录 一、理论 1.SaltStack 二、实验 1.主机一安装master 2.主机二安装第一台minion 3.主机三安装第二台minion 4.测试SaltStack 一、理论 1.SaltStack &#xff08;1&#xff09;概念 SaltStack是基于python开发的一套C/S自动化运维工具&#xff0c;通信采用了zerom…

【UML】组件图中的供需接口与面向对象中的接口

UML&#xff08;统一建模语言&#xff09;组件图中的“供接口”&#xff08;Provided Interface&#xff09;和“需接口”&#xff08;Required Interface&#xff09;与面向对象编程中的接口概念有关联&#xff0c;但它们在应用上有所区别。 下面解释两者的关系&#xff1a; …

2023下半年软考复盘反思

工作十几年了&#xff0c;一直想考一个高级职称、但是疫情三年也没心思考&#xff0c;不想出去折腾。疫情过去&#xff0c;今年下半年想考一个&#xff0c;由于工作忙&#xff0c;准备了30天&#xff0c;成绩已经出了&#xff0c;先说结果&#xff1a;未通过。现在对这个过程反…

ElementPlus中的分页逻辑与实现

ElementPlus中的分页逻辑与实现 分页是web开发中必不可少的组件&#xff0c;element团队提供了简洁美观的分页组件&#xff0c;配合table数据可以实现即插即用的分页效果。分页的实现可以分成两种&#xff0c;一是前端分页&#xff0c;二是后端分页。这两种分页分别适用于不同…

three.js(二)

three.js&#xff08;二&#xff09; 参考前言正文简单开始(不使用任何框架)补充 粗略带过(使用Vue框架)细致讲解(比如我使用react框架)App.jsx 的进阶版 项目打包补充打包遇到的问题:原因:解决办法: 参考 https://threejs.org/docs/ 前言 上一集中,我们用到了three.js的一个…

Redis-分片集群大纲

1. Redis集群方案比较 哨兵分片 2. Redis分片集群搭建 3. Java操作redis分片集群 jedislettuce 4. Redis集群原理分析 槽位定位算法 HASH_SLOT CRC16(key) mod 16384 跳转重定位 Redis集群节点间的通信机制 gossip && gossip通信的10000端口 Redis集群选举…

AUTOSAR_RS_LogAndTrace中文翻译(待更)

4功能概述 5.功能要求 5.2.1.1通用型 1.日志记录应支持初始化和注册 2. 日志功能应该使应用程序提供日志信息 3. 日志功能应能和追踪应用程序之间通信&#xff0c; 4. 日志应支持对日志信息进行分组&#xff0c;使用案例&#xff1a;关联过滤所有属于一起的日志信息 5. 日志记…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十四:系统设置模块相关功能实现

一、本章内容 本章使用已实现的公共组件实现系统管理中的系统设置模块相关功能,包括菜单管理、角色管理、日志管理、用户管理、系统配置、数据字典等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址:

scrapy post请求——百度翻译(十四)

scrapy处理 post 请求 爬取百度翻译界面 目录 1.创建项目及爬虫文件 2.发送post请求 1.创建项目及爬虫文件 scrapy startproject scrapy_104 scrapy genspider translate fanyi.baidu.com 2.发送请求 post请求需要传递参数&#xff0c;所以就不能用start_urls和parse函数了&…