体系班第十七节(经典递归)

1汉诺塔 

从左移到最右,圆盘必须满足小压大原则

写一个大方法,大方法包括两步:第一步将最后一个圆盘上面的所有的放到第二个塔上面,然后将最后一个圆盘放到最后塔上面,再把第二个塔上面圆盘全放在第三个塔上面

#include <iostream>using namespace std;// 将 1~N 层圆盘从左 -> 右
void leftToRight(int n);// 将 1~N 层圆盘从左 -> 中
void leftToMid(int n);// 将 1~N 层圆盘从右 -> 中
void rightToMid(int n);// 将 1~N 层圆盘从中 -> 右
void midToRight(int n);// 将 1~N 层圆盘从中 -> 左
void midToLeft(int n);// 将 1~N 层圆盘从右 -> 左
void rightToLeft(int n);// 汉诺塔问题
void hanoi1(int n) {leftToRight(n);
}void leftToRight(int n) {if (n == 1) { // 基本情况cout << "Move 1 from left to right" << endl;return;}leftToMid(n - 1);cout << "Move " << n << " from left to right" << endl;midToRight(n - 1);
}void leftToMid(int n) {if (n == 1) {cout << "Move 1 from left to mid" << endl;return;}leftToRight(n - 1);cout << "Move " << n << " from left to mid" << endl;rightToMid(n - 1);
}void rightToMid(int n) {if (n == 1) {cout << "Move 1 from right to mid" << endl;return;}rightToLeft(n - 1);cout << "Move " << n << " from right to mid" << endl;leftToMid(n - 1);
}void midToRight(int n) {if (n == 1) {cout << "Move 1 from mid to right" << endl;return;}midToLeft(n - 1);cout << "Move " << n << " from mid to right" << endl;leftToRight(n - 1);
}void midToLeft(int n) {if (n == 1) {cout << "Move 1 from mid to left" << endl;return;}midToRight(n - 1);cout << "Move " << n << " from mid to left" << endl;rightToLeft(n - 1);
}void rightToLeft(int n) {if (n == 1) {cout << "Move 1 from right to left" << endl;return;}rightToMid(n - 1);cout << "Move " << n << " from right to left" << endl;midToLeft(n - 1);
}int main() {// 测试int n = 3; // 圆盘的层数hanoi1(n);return 0;
}

 

递归2:把三个塔分为from other to 

#include <iostream>using namespace std;// 汉诺塔问题
void hanoi2(int n) {if (n > 0) {func(n, "left", "right", "mid");}
}// 递归函数
void func(int N, string from, string to, string other) {if (N == 1) { // 基本情况cout << "Move 1 from " << from << " to " << to << endl;} else {func(N - 1, from, other, to);cout << "Move " << N << " from " << from << " to " << to << endl;func(N - 1, other, to, from);}
}int main() {// 测试int n = 3; // 圆盘的层数hanoi2(n);return 0;
}

2打印一个字符串的全部子序列
递归思路:第一个参数是原字符串,第二个index是当前来到的字符,path是之前已经选好的部分串,第三个参数是所有结果的保存

#include <vector>
#include <string>using namespace std;class Solution {
public:vector<string> subs(string s) {vector<char> str(s.begin(), s.end());string path = "";vector<string> ans;process1(str, 0, ans, path);return ans;}private:void process1(vector<char>& str, int index, vector<string>& ans, string path) {if (index == str.size()) {ans.push_back(path);return;}// 不要索引位置的字符process1(str, index + 1, ans, path);// 要索引位置的字符process1(str, index + 1, ans, path + str[index]);}
};

 3题 求所有不同的子序列,只要改成set结构收集答案即可

4 打印一个字符串的全部排列

去除该字符后需要回溯去恢复现场

#include <vector>
#include <string>using namespace std;class Solution {
public:vector<string> permutation1(string s) {vector<string> ans;if (s.empty()) {return ans;}string path = "";vector<char> rest(s.begin(), s.end());f(rest, path, ans);return ans;}private:void f(vector<char>& rest, string path, vector<string>& ans) {if (rest.empty()) {ans.push_back(path);} else {int N = rest.size();for (int i = 0; i < N; i++) {char cur = rest[i];rest.erase(rest.begin() + i);f(rest, path + cur, ans);rest.insert(rest.begin() + i, cur);}}}
};

 递归2:

不停地做字符串前一位和后一位交换,而且是在原字符串上面交换

#include <vector>
#include <string>using namespace std;class Solution {
public:vector<string> permutation2(string s) {vector<string> ans;if (s.empty()) {return ans;}char* str = &s[0];g1(str, 0, ans);return ans;}private:void g1(char* str, int index, vector<string>& ans) {if (str[index] == '\0') {ans.push_back(string(str));} else {for (int i = index; str[i] != '\0'; i++) {swap(str[index], str[i]);g1(str, index + 1, ans);swap(str[index], str[i]);}}}void swap(char& a, char& b) {char temp = a;a = b;b = temp;}
};

5去重过后的排列

在上一题代码做改动,如果某个字符已经试过了,那就在后面在遇到时就不尝试了

 

#include <vector>
#include <string>using namespace std;class Solution {
public:vector<string> permutation3(string s) {vector<string> ans;if (s.empty()) {return ans;}char* str = &s[0];g2(str, 0, ans);return ans;}private:void g2(char* str, int index, vector<string>& ans) {if (str[index] == '\0') {ans.push_back(string(str));} else {bool visited[256] = { false }; // 记录字符是否已被访问for (int i = index; str[i] != '\0'; i++) {if (!visited[str[i]]) { // 如果字符尚未访问过visited[str[i]] = true; // 标记字符已被访问swap(str[index], str[i]);g2(str, index + 1, ans);swap(str[index], str[i]);}}}}void swap(char& a, char& b) {char temp = a;a = b;b = temp;}
};

 6 递归逆序栈

#include<stack>
using namespace std;
//该函数的功能是返回栈底的元素
int f(stack<int>& s)
{int result = s.top();s.pop();if (s.empty()){return result;}else {int last = f(s);s.push(result);return last;}
}
void reverse(stack<int>& s)
{if (s.empty())return;int i = f(s);reverse(s);s.push(i);
}

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

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

相关文章

C语言的位操作与位字段

C语言中的位操作允许程序员直接在整型变量的单个位或位组上进行操作。这种操作在许多低级编程任务中非常有用&#xff0c;尤其是在嵌入式系统编程中&#xff0c;如硬件操作、设备驱动及性能优化等场景。位操作主要使用以下几种位操作符&#xff1a; & &#xff08;按位与&a…

深入理解TCP:序列号、确认号和自动ACK的艺术

深入理解TCP&#xff1a;序列号、确认号和自动ACK的艺术 在计算机网络的世界里&#xff0c;TCP&#xff08;传输控制协议&#xff09;扮演着至关重要的角色。它确保了数据在不可靠的网络环境中可靠地、按顺序地传输。TCP的设计充满智慧&#xff0c;其中序列号&#xff08;Seq&a…

Dom多个事件绑定addEventListener、鼠标事件、拖拽元素

1 Dom多个事件绑定addEventListener(): addEventListener() - 也可以通过addEventListener()来为元素绑定事件 addEventListener(type, listener [, useCapture]) - 参数&#xff1a; type 要监听的事件的字符串&#xff0c;注意这里不需要写on listener 回调函数&#x…

JavaSE-----认识异常【详解】

目录 一.异常的概念与体系结构&#xff1a; 1.1异常的概念&#xff1a; 1.2一些常见的异常&#xff1a; 1.3异常的体系结构&#xff1a; 1.4异常的分类&#xff1a; 二.异常的处理机制&#xff1a; 2.1 抛出异常&#xff1a; 2.2异常的捕获&#xff1a; 2.3try-catch-&…

jQuery中的事件

jQuery中的事件 jQuery事件是对JavaScript事件的封装&#xff0c;常用事件分类如下&#xff1a; 基础事件&#xff1a;window事件 鼠标事件 键盘事件 表单事件 复合事件(多个事件的组合)&#xff1a;鼠标光标悬停 鼠标连续点击 1、鼠标事件 鼠标事件是当用户在文档上移…

3月16日ACwing每日一题

562. 壁画 - AcWing题库 #include <bits/stdc.h> using namespace std; const int N 5e6 6; //可以枚举每一种情况 因为都是相连的所以肯定是前缀和 int main() {int t;cin >> t;for (int i 1; i < t; i) {char s[N];int n;cin >> n;int a[N]; // 修改…

某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

从零开始学习编程:迈出你的编程之路

标题 《从零开始学习编程&#xff1a;迈出你的编程之路》摘要引言如何开始学习编程&#xff1f;1. **明确学习目标**2. **选择编程语言**3. **学习资源**4. **练习编程**5. **参与社区**6. **持之以恒**7. **探索更多** 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主…

阅读 - 二维码扫码登录原理

在日常生活中&#xff0c;二维码出现在很多场景&#xff0c;比如超市支付、系统登录、应用下载等等。了解二维码的原理&#xff0c;可以为技术人员在技术选型时提供新的思路。对于非技术人员呢&#xff0c;除了解惑&#xff0c;还可以引导他更好地辨别生活中遇到的各种二维码&a…

Ubuntu 14.04:PaddleOCR基于PaddleHub Serving的服务部署(失败)

目录 一、为什么使用一键服务部署 二、安装 paddlehub 1.8 2.1 安装前的环境准备 2.2 安装paddlehub 1.8 2.2.1 安装paddlehub 2.2.2 检测安装是否成功 2.2.3 检查本地与远端PaddleHub-Server的连接状态 2.2.4 测试使用 2.3 其他 2.3.1 如何卸载、pip常用命令、常见…

如何保存缓存和MySQL的双写一致呢?

如何保存缓存和MySQL的双写一致呢&#xff1f; 所谓的双写一致指的是&#xff0c;在同时使用缓存(如Redis)和数据库(如MySQL)的场景下,确保数据在缓存和数据库中的更新操作保持一致。当对数据进行修改的时候&#xff0c;无论是先修改缓存还是先修改数据库&#xff0c;最终都要保…

transformer注意力权重系数绘图

参考绘制tsne图&#xff0c;首先将模型中的注意力权重导出&#xff0c;因为我的模型中L2&#xff0c;所以导出两层 # plot_weight weight_model_layer0 Model(inputsmodel.inputs, outputsmodel.get_layer(transformer_0).output) weight_output_layer0 weight_model_layer0…

C语言内存函数详解

文章目录 前言一、memcpy函数&#xff08;内存拷贝函数&#xff09;二、memmove重叠拷贝函数三.memset内存设置函数四.memcmp内存比较函数总结 前言 我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数&#xff0c;接下来我们就学习一下关于内存相关的一些函数。…

第十四届蓝桥杯 三国游戏

一开始的思路就是想着暴力&#xff0c;但是呢&#xff0c;如果真的用暴力一个一个列的话&#xff0c;连30%的数据都搞定不了&#xff0c;所以这里需要考虑别的办法。 这道题的思路就是贪心。 我们这样想&#xff1a;既然要满足至少一个国X>YZ&#xff0c;那么我们何不变成…

超实用绿色办公软件介绍

自制的绿色软件办公秘书软件&#xff0c;集成了自动任务、文件工具、PDF工具、OCR图文识别、文字处理、电子表格六大类30多项实用功能&#xff0c; 开发目的是解决常见办公痛点&#xff0c;把机械的操作还给机器&#xff0c;实现轻松、高效办公。 功能介绍如下&#xff1a; 一…

EndeavourOs(arch系)安装sunpinyin输入法(ibus) + 迅雷(xunlei-bin)

输入法 yay -S ibus yay -S ibus-libpinyin yay -S ibus-sunpinyin yay -Q ibus ibus-libpinyin ibus-sunpinyin #验证 # 注销然后打开ibus config... # 在Input Method 添加Chinese->SunPinYin # 使用Ctrl Space, 默认Super Space, 请自行修改 # 再次注销&#xff0c;开…

Linux环境下Minio的安装部署与启动教程(完整版)

1、概述 MinIO是一个开源、分布式的对象存储系统&#xff0c;专为云原生环境设计。它提供了一个基于标准的Amazon S3兼容接口&#xff0c;使得开发者可以使用熟悉的API在私有云或边缘环境中部署和管理大规模非结构化数据&#xff0c;如图片、视频、日志文件等。 MinIO的核心特…

安卓UI面试题 41-45

41. View.inflate和LayoutInflater.inflate的区别? 实际上没有区别,View.inflate实际上是对LayoutInflater.inflate做了一层包装, 在功能上,LayoutInflate功能更加强大。View.inflate实际上最终调用的还是LayoutInflater.inflate (@LayoutRes int resource, @nullable Vie…

ChatGLM:基于ChatGLM-6B使用ptuning进行微调,实现类instruction的效果

由于业务需要&#xff0c;调研下怎么训练一个虚拟角色出来&#xff0c;所以找了一些文档参考&#xff0c;其中有一个基于ChatGLM-6B使用ptuning进行微调&#xff0c;实现类instruction的效果的现成的项目&#xff0c;给大家分享下。 一、介绍 由于ChatGLM-6B 不支持instructio…

2、计划任务不显示UI的问题

计划任务不显示UI的问题 1、原因&#xff1a; 在windows7以上系统&#xff0c;使用system权限启动的进程默认是没有ui界面&#xff0c;这是windows系统出于安全考虑的限制。防止用户在高权限下误删重要的文件。 2、解决方案&#xff1a; 1、降权 解决的办法&#xff1a;降…