回溯算法实际上就是暴力枚举,只不过它有着递归的保护才得以由此美称,很多人也把该算法称作是万能解题法。

现在就让让我们一起走入这个使你头疼的算法吧。

要想讲解清楚这个算法还真不是一件容易的事情,所以能够帮到大家就是最好的事情了,我尽力吧。

只有文字的讲解让人看着想睡觉,我会借助图片进行讲解。

栗子:

给你一个数N,如果将1到N的所有数字以长度为k输出,请编写程序展示所有的组合可能,不能存在重复的组合。

比如:

输入:N=4,k=2.

输出:[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]这就是长度为k的所有可能组合

如果是你编写程序函数的话,你会怎么样做呢。当然我相信很多朋友是可以做得出来的,直接两个for循环就可以搞定。这里两层for语句我也来写一下,也是为了下面讲解做好铺垫。

整体代码:(会的朋友直接跳过)

进一步使用图形来分析这一过程:

遍历第一层的第一个作为组合的开始有[1,2],[1,3],[1,4]这三种结果。

遍历第一层的第二个作为组合的开始有[2,3],[2,4]这两种结果。或许在这里就有朋友疑惑了,为什么第二层遍历不需要遍历1,直接遍历3,4就行了,因为题目不允许。要求是输出组合,而不是排序组合,排序组合的话就需要。因为[1,2],[2,1]就是排序不同的组合。

遍历第一层的第三个作为组合的开始只有[3,4]这种结果。

那么也就全部组合可能都遍历完了。

大家有没有感觉到像树的遍历。组合结果全在叶子结点上。最后只需要遍历叶子结点就可以得到所有组合结果了。其实直接使用递归也是可以完成的,第一次递归就是遍历第一层,第二次递归遍历第二层。递归的次数取决于树的高度。这里大家一定要这样的概念,每一次的递归都是在遍历每一层。

好了,让我们回到回溯算法中去。

回溯算法就是在递归函数下有回溯操作。(不理解没关系,接着看下面的就好)

这道题采用回溯算法来解决函数应该怎么写呢?

解释:其中combinations是存放组合所有结果的数组,path数组时存放单个组合结果的数组

先用图形走一遍过程:

首先遍历递归遍历第一层,将1存入到path数组中。然后继续递归,将2存入path数组中,则path=[1,2](在这里多说一嘴,怎么判断递归停止条件,仔细的朋友应该已经知道了,停止条件就是path数组中元素长度等于输入的k时),将path结果组合存入combination整体数组中。即combination[0]=[1,2],递归在这里结束返回上一层递归,但有一个非常非常重要的一步---回溯操作。也就是将path数组中的第二个元素置为空,让path数组变为[1]。接着递归下一个元素,将元素3存入path数组中,得到的path=[1,3]...一直循环下去,直到所有的结果都被找到。

回溯操作过程:

将path中的2去掉,为了添加入新的元素3。如果不执行回溯操作的话,path数组依然为[1,2],接下来再继续添加新的元素3进来变为[1,2,3],再继续就是[1,2,3,4],所有这就是为什么要回溯的原因。

整体代码:

在最后我也把回溯算法的模板也给大家写一下吧,

回溯算法详细讲解(C语言)相关推荐

  1. dijkstra标号法表格_Dijkstra算法详细讲解

    最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...

  2. lamport面包店算法详细讲解及代码实现

    lamport面包店算法详细讲解及代码实现 1 算法详解 1.1 一个较为直观的解释 1.2 Lamport算法的时间戳原理 1.3 Lamport算法的5个原则 1.4 一个小栗子 2 算法实现 3 ...

  3. Adaboost算法详细讲解

    转自线上数据建模 Adaboost算法详细讲解 Adaboost(Adaptive Boosting): Adaboost是Boosting模型,和bagging模型(随机森林)不同的是:Adaboo ...

  4. 模拟退火算法详细讲解(含实例python代码)

    模拟退火算法详细讲解(含实例python代码) (一)模拟退火算法简介 (二)模拟退火算法原理 (三)退火过程中参数控制 (四)算法步骤 (五)实例分析 最近老师要求做模拟退火算法实验,看了很多博客之 ...

  5. C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...

  6. 排序算法详细讲解(超酷)

    目录 前言 一.插入类排序 1.直接插入排序 2.折半插入排序 3.希尔排序 二.交换类排序 1.冒泡排序(相邻比序法) 2.快速排序 三.选择类排序 1.简单选择排序 2.树形选择排序 3.堆排序 ...

  7. Dijkstra算法 详细讲解

    Dijkstra算法 详细解释 Dijkstra算法适用于边权值为正的情况,如果边权值为负数就才用另一种最短路算法Bellman-Ford算法. 该算法是指从单个源点到各个结点的最短路,该算法适用于有 ...

  8. KMP算法详细讲解(看完不会请打我)

    文章目录 前言 一:情景导入-如何快速在一个主串找到目标字符串 二:详解KMP (1)暴力匹配的缺点 (2)最长相同前缀和后缀 (3)究竟怎么回溯 (3)next数组 (4)求解next数组 A:ne ...

  9. 详细讲解Html语言的书,HTML语言基础讲解.ppt

    * 提问:根据上述效果图,先抽选一名学员在白板上画出在网页中的显示效果, 其余学员在纸上上书写答案.教员巡视学员基本做完 ,集中评讲 ,给出如图所示的效果图.给予学员鼓励. 参见:TG5-Source ...

最新文章

  1. 人工智能技术映射出来的16个行业66个应用场景!
  2. mysql中的索引对查询的影响
  3. 关于android:id=@+id/xx的理解
  4. Oracle条件查询语句-where
  5. 手机百度输入法的用户体验
  6. C++工作笔记-对容器模板的初步认识
  7. PS 滤镜算法原理——染色玻璃
  8. kettlejava脚本的api_[翻译]KETTLE JAVA API :编程定制自己的Kettle转换(transformation)...
  9. Silverlight 4.0 Accordion 解决ScrollViewer 的问题
  10. uniapp动态显示数组_【报Bug】uniapp 在小程序中 动态修改添加 数组 数据 ,点击获取的索引值错误...
  11. 转载——关于bp神经网络
  12. TUIO协议 (转)
  13. 经验谈:写给新手的反激变压器KRP详解
  14. 3541. 代码查重
  15. shell 后台运行
  16. 150条经典社会生存法则
  17. 任正非最新讲话:最好的防御就是进攻
  18. Synergistic Saliency and Depth Prediction for RGB-D Saliency Detection
  19. 安全集成服务资质是什么都有哪些等级?申请安全集成服务资质认证有什么好处?
  20. Win10Chrome调试安卓Chrome

热门文章

  1. WeMOS D1 MIni(Esp8266)、NodeMCU与ST7789 TFT液晶显示屏绘制图形
  2. 我看了半天还是没看明白大巴为什么当上助攻王的原因,反而稀里糊涂看了那么多国产后卫的名字
  3. 湖南省物联网挑战赛 物联网平台说明文档
  4. 转:云计算合同中需要注意的十大关键条款
  5. Arm linux系统启动流程简介
  6. HTML根据当前时间显示问候语,用原生JS写根据时间显示问候语
  7. Delphi TIdHttp TIdFtp 文件下载
  8. ProSci 艾美捷14 3 3 zeta抗体说明书
  9. location.reload() 和 location.replace()的区别和应用。
  10. Windows系统获取屏幕宽度和高度