回溯法——两类问题的递归方法解析

2023-11-07

最近在学习回溯法,有些心得,记录下来。

之前学习了分治法,动态规划,和回溯法拿在一起考虑,发现其利用递归的思想很巧妙,我自己总结的认为递归的核心思想就是考虑整体中所有个体都有的一般规律,将其描述出来;然后进行递归,到下一个个体;当到达分解的尾部时,则返回。

回溯法中的两类问题:

子集树:求整体的所有子集;

排列树:求整体的所有不同排列。

(我只列了两类的最基本的两个问题)

其核心便是如何进行个体的组合(子集树中哪个个体不加入当前子集,哪个加入;排列树中,当前个体与哪个个体交换)。对于个体组合可以考虑到递归,因为递归把整体分解成个体来解决问题,所以可以很方便的得到相应的解答。

子集树

对于这个问题来说,如果用递归思想来考虑,其实就是如何组合整体的个体,而对每一个个体而言,只有加入组合和不加入组合两种情况,所以,我们只需对两种不同情况分别进行递归即可。而输出的时候,每次输出都要在整体的所有个体全都遍历一遍后才能输出(对每个个体都决定一下是否输出),这要即可输出全部个体。

对个体的两种情况可以用0,1来代替,0代表不输出,1代表输出。判断是否输出可以用当前的数组下标是否是字符串的最后字符下标,如果是,则输出,不是,则继续进行个体判断和递归。

(代码的注释说明了整个回溯的流程)

//输出结果的代码为:
if(t >= n)
    show(a);
//其中,t为当前的数组下标,n为字符串长度。a数组保存每个个体对应的情况。
//个体判断并进入下层递归的代码:
else
{							
	for (int i = 0; i <= 1; i++)	//两种情况,首先用第一种,然后用第二种
    {
	a[t] = i;				
    /*
    *第一次输出是每个个体都决定为0,即不输出,所以为空串,最后一次输出是倒数第二次输
    *出从尾端不断回退,回到头部,然后头部进行其for循环的第二次,决定为1,后面的在之
    *前也都决定为1了,所以最后一次输出为整个字符串。
    */		
        backtracking(t+1);		
    }
}
//show函数如下:
void show(int a[])
{
	for (int i = 0; i < n; i++) 
        {
	    if(a[i] == 1)		//如果当前个体对应的是输出
   		cout<<s[i];	//则输出此个体
	}
	cout<<endl;	
}


排列树

同理子集树思想,排序树其实就是两个个体看作一个小整体,只用考虑两者是否交换,也是两种情况,第一种交换,第二种不交换。但是与子集树不同的是,排列树里面为了方便,会直接对目标字符串进行修改,所以在交换后,我们还要记得再换回来,保证所有的情况都考虑到。

(代码的注释说明了整个回溯的流程)

由于输出与子集树的判断相同,这里就不再列出

//决定是否交换和进行下一次递归的代码:
/*
*这里与子集树不同,因为所有不同的个体间都可以两两交换,如第一个可以和最后一个交
*换,所以要把所有情况考虑到,t即为当前进行到的个体,而i为要与t进行交换的个体位
*置
*/
for (int i = t; i < n; i++)		
{
/*
*第一次执行时是自身与自身交换,即第一次输出为不交换的目标字符串自身,而之后当前
*个体会与其后面的每一个依次进行交换
*/
	swap(i, t, s);		//s即为输入的字符串	
//不断向下一个元素迈进,从最后一个个体开始进行交换后的恢复
	backtracking(t+1);	
	swap(i, t, s);		//恢复交换过的两个字符,为了保证所有情况都可以计算在内
}

要时刻记得递归的核心思想是考虑整体中所有个体都有的一般规律,将这个规律描述出来;然后向下一个个体迈进;到达分解的结尾则返回。

文章为博主自学的心得体会,如有错误,欢迎指正。

参考文章

回溯法的解题步骤与例子解析 

感谢 若明天不见 博主的文章

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

回溯法——两类问题的递归方法解析 的相关文章

  • 雅思词汇表8000词版_你别不信,雅思光靠背单词也能上6.5!

    点击上方蓝字关注我哦 打算备考雅思 大家都是知道IELTS考试对词汇量要求是比较高的 如果自身的英语基础薄弱 想短时间内在雅思成绩上有所突破是很困难的一件事情 因此很多考生会 病急乱投医 购买各式各样雅思词汇手册进行疯狂记忆 每本单词手册都
  • Keil 重定向 fputc 函数 以及 printf 函数的代码尺寸测试

    本文的开发环境为 Keil Cortex M3 内核处理器 重定向 fputc 函数方法 如果想使用库函数 printf 必须要将 fputc 重定向到自己的串口上 术语 重定向 可以理解为用户重写 fputc 函数 在重写的函数体内调用自
  • vulnhub-KIOPTRIX: LEVEL 1.3 (#4)-KioptrixVM4靶场

    以下演示均在测试环境进行 遵纪守法 靶场下载地址 Kioptrix Level 1 3 4 VulnHub 镜像下载解压之后是一个 vhd文件 需要新建虚拟机 虚拟机操作系统任选一个linux系列的系统 一直下一步 到了设置磁盘 按照截图设

随机推荐

  • Qt系列文章之(十) ui文件的使用

    上一篇文章在主函数中构造了一个简单的主窗口界面 继承了一些基本元素 如菜单栏 工具栏 悬浮窗口 主界面等元素 不过这些元素都是在栈区开辟的临时变量 放在主函数里面来实现 这不是一种标准的UI界面开发手段 一般在界面项目开发之中有几个典型的开
  • PyCharm远程连接失败、错误,报错:Can‘t connect...【解决方法与错误分析】

    学习网站推荐 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 文章目录 一 前言 二 报错 2018版 2020版 三 错误分析 我的错误原因 其他3种可能因粗心导致的原因 四 如果你不想再
  • HTTPX从入门到放弃

    1 什么是HTTPX HTTPX是一款Python栈HTTP客户端库 它提供了比标准库更高级别 更先进的功能 如连接重用 连接池 超时控制 自动繁衍请求等等 HTTPX同时也支持同步和异步两种方式 因此可以在同步代码和异步代码中通用 HTT
  • Swift语法学习--协议基础

    文章目录 协议定义 typealias关键词类型定义新的名称 associatedtype增加协议功能 协议定义 typealias关键词类型定义新的名称 不做赘述 typealias Distance Double typealias P
  • 游戏对象与图形基础

    游戏对象与图形基础 这是有游戏编程的第四次作业 对MVC深入 文章目录 游戏对象与图形基础 说明文档 作业内容 1 基本操作演练 建议做 2 编程实践 需求分析 新版的设计与实现 说明文档 本次实验完成了所有基本要求 尽量将步骤展示出 闪光
  • java中把判断大小的字符串转换成可判断的布尔值

    ScriptEngineManager manager new ScriptEngineManager ScriptEngine se manager getEngineByName js String str 1 lt 3 boolean
  • OpenCV

    OpenCV polylines绘制多边形 1 四边形 Mat image 300 300 CV 8UC3 Scalar 255 255 255 300X300大小的白色图像 Point pnt 1 4 Point 100 100 左上角
  • 【计算机网络】Linux环境中的网络套接字编程

    文章目录 前言 一 预备知识 理解源IP地址和目的IP地址 认识端口号 认识UDP协议和TCP协议 了解网络字节序 二 socket 套接字 socket 常见API sockaddr 和 sockaddr in 三 UDP Socket编
  • .Net web service studio的使用

    无意间发现有个比较好的工具 它很小才几十K而已 真的很轻量 就是web service studio 可以用来测试web service 因为web service因为其返回结果的特殊性以及请求的不一样 平时也很难去测试这个接口到底能否使用
  • 系统分析与设计-用例建模之业务建模方法

    系统分析与设计 用例建模之业务建模方法 文章目录 系统分析与设计 用例建模之业务建模方法 使用 UMLet 建模 根据订旅馆建模文档 根据课程练习 投递员使用投递箱给收件人快递包裹 的业务场景 根据上述流程 给出快递柜系统最终的用例图模型
  • csrf攻击原理与解决方法_前端

    1 CSRF 的攻击类型 CSRF 全称 Cross Site Request Forgery 跨站请求伪造 也被称为 XSRF one click attack 或者 session riding 是一种劫持受信任用户向服务器发送非预期请
  • python实战——下载推女郎图片

    说明 python2 7或3 4小脚本 这个小软件是和urllib和urllib2的使用结合了python网页获取异常的处理 原理非常简单 适合初学者练手 功能 下载这个网站上的图片 成果 先放福利啦 分析 首先 想下载网站上的图片就需要获
  • 【转】Android APP性能及专项测试(个人整理)

    转载地址 https www zybuluo com defias note 592309 Android篇 1 性能测试 Android性能测试分为两类 1 一类为rom版本 系统 的性能测试 2 一类为应用app的性能测试 Androi
  • matlab 点云配准——计算配准精度

    目录 一 概述 1 前言 2 数据准备 二 代码实现 三 结果展示 四 测试数据 一 概述 1 前言 众所周知 点云配准的精度评价标准是均方根误差 2 数据准备 沿X方向平移0 1m得到下图的两期点云
  • ARP攻击与防范实践

    1 ARP中间人攻击原理 攻击原理 攻击者利用ARP机制 让PC A学习到IP S与MAC B的映射关系 又让Server学习到IP A 与MAC B的映射关系 如此一来 PC A与Server之间交互的IP报文都会经过攻击者中转 漏洞分析
  • 机器学习中的 AUC ROC 曲线指南:什么是特异性-附源码

    介绍 您已经构建了机器学习模型 那么下一步是什么 您需要评估并验证它有多好 或多坏 以便您可以决定是否实施它 这就是 AUC ROC 曲线的用武之地 这个名字可能拗口 但它只是说我们正在计算 接收者操作特征 ROC 的 曲线下面积 AUC
  • 在IDEA中Spring boot配置热部署无效问题解决方式

    只要在pom文件中添加下面代码段即可
  • html 图片加载优化

    在项目开发中 如果页面中图片过多 就会出现页面加载缓慢的问题 优化的方案为图片降级 div class box img alt img alt div 首先考虑使用webp格式的图片 因为webp格式的图片拥有无损压缩和有损压缩两种模式而且
  • 面试题篇-09-RocketMQ相关面试题

    文章目录 1 RocketMQ如何保证消息有序消费 2 RocketMQ和Kafka 快的飞起 底层存储有什么不同 2 1 什么是 零拷贝 2 1 1 传统IO数据读写 2 1 2 mmap优化 3次切换 3次拷贝 2 1 3 SendFi
  • 回溯法——两类问题的递归方法解析

    最近在学习回溯法 有些心得 记录下来 之前学习了分治法 动态规划 和回溯法拿在一起考虑 发现其利用递归的思想很巧妙 我自己总结的认为递归的核心思想就是考虑整体中所有个体都有的一般规律 将其描述出来 然后进行递归 到下一个个体 当到达分解的尾