一、什么是回溯算法

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

回溯算法实际上一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。

二、回溯算法思想

回溯法一般都用在要给出多个可以实现最终条件的解的最终形式。回溯法要求对解要添加一些约束条件。总的来说,如果要解决一个回溯法的问题,通常要确定三个元素:

1、选择。对于每个特定的解,肯定是由一步步构建而来的,而每一步怎么构建,肯定都是有限个选择,要怎么选择,这个要知道;同时,在编程时候要定下,优先或合法的每一步选择的顺序,一般是通过多个if或者for循环来排列。

2、条件。对于每个特定的解的某一步,他必然要符合某个解要求符合的条件,如果不符合条件,就要回溯,其实回溯也就是递归调用的返回。

3、结束。当到达一个特定结束条件时候,就认为这个一步步构建的解是符合要求的解了。把解存下来或者打印出来。对于这一步来说,有时候也可以另外写一个issolution函数来进行判断。注意,当到达第三步后,有时候还需要构建一个数据结构,把符合要求的解存起来,便于当得到所有解后,把解空间输出来。这个数据结构必须是全局的,作为参数之一传递给递归函数。

三、递归函数的参数的选择,要遵循四个原则

1、必须要有一个临时变量(可以就直接传递一个字面量或者常量进去)传递不完整的解,因为每一步选择后,暂时还没构成完整的解,这个时候这个选择的不完整解,也要想办法传递给递归函数。也就是,把每次递归的不同情况传递给递归调用的函数。

2、可以有一个全局变量,用来存储完整的每个解,一般是个集合容器(也不一定要有这样一个变量,因为每次符合结束条件,不完整解就是完整解了,直接打印即可)。

3、最重要的一点,一定要在参数设计中,可以得到结束条件。一个选择是可以传递一个量n,也许是数组的长度,也许是数量,等等。

4、要保证递归函数返回后,状态可以恢复到递归前,以此达到真正回溯。

四、学习例题

1.给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]

2.思路

首先利用回溯枚举出所有括号的可能性,然后进行判断是否符合要求(n对并且是有效的括号组合),就添加到list表格中。

对于递归函数变量需要全局变量列表list:用来存储符合要求的括号组合。

局部变量temp:表示当前函数的括号组成样式。

计数器x:判断递归次数,限制其底界。

总的形成括号对数n。

3.代码(力扣中国第22题)

public List generateParenthesis(int n) {        List list=new ArrayList();        add_list(list,"(", 1, n*2);               return list;    }        //书写递归函数        public void add_list(List list,String temp,int x,int n)        {        x++;        if(x<=n)        {          add_list(list,temp+"(",x,n);          add_list(list,temp+")",x,n);                    }        if(x>n)        {            //在这里写判断条件是否符合有效的括号组合            char[] k=temp.toCharArray();            //计数器            int timer=0;            for(int i=0;in/2)                {                    return;                }                else                {                    if(k[i]=='(')                      {                          timer++;                      }else                      {                          timer--;                                                }                }                         }            if(timer==0)            list.add(temp);        }            }

回溯法遵循深度优先吗_回溯算法(一)相关推荐

  1. 回溯法遵循深度优先吗_闲来刷下「回溯算法」

    定义 ❝ 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向 ...

  2. LeetCode算法总结-回溯法与深度优先搜索

    转载自  LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...

  3. 回溯法采用的搜索策略_五大常用算法之四:回溯法

    1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向 ...

  4. 回溯法(深度优先搜索)

    描述: 回溯法按深度优先搜索 搜索问题的解空间树.首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数 判断该节点是否可行.如果不可行,则跳过对该节点为根的子树搜索,逐层向其 ...

  5. 回溯法与深度优先搜索的关系

    回溯简介 回溯是搜索算法中的一种控制策略,它的基本思想是:为了求得问题的解,先选择一种可能的情况向前探索,如果在探索过程中发现原来的选择是错误的,就退回一步重新选择,如此反复进行,直到穷举出所有情况, ...

  6. 回溯法(深度优先)剪枝和分支限界法(宽度优先)剪枝对比:01背包问题

    限界函数: CurValue + rest <= BestValue 回溯法(深度优先)剪枝 # 递归方式 class pack_01_back_prune_test: def __init__ ...

  7. 算法设计与分析第5章 回溯法(一)【回溯法】

    第5章 回溯法 5.1 回溯法 1.回溯法的提出  有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法. 2. 问题的解空间 (1)问题的解向量:回溯法希望 ...

  8. 算法设计与分析第5章 回溯法(二)【回溯法应用】

    第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...

  9. 回溯法采用的搜索策略_数值优化|笔记整理(3)——线搜索中的步长选取方法,线性共轭梯度法...

    上一节笔记传送门: 学弱猹:数值优化|笔记整理(2)--线搜索:步长选取条件的收敛性​zhuanlan.zhihu.com ------------------------------------ 大 ...

最新文章

  1. 高可用架构设计之无状态服务
  2. discuz 生成静态html,Discuz论坛静态化设置方法
  3. 利用iframe无刷新上传文件的坑
  4. ios开发之.pch文件的使用
  5. 使用jquery打造一个动态的预览产品颜色效果
  6. Leetcode--394. 字符串解码(Java)
  7. 由二分查找算法学习算法的时间复杂度
  8. 神奇的幻方(洛谷P2615题题解,Java语言描述)
  9. nginx配置中root与alias的区别
  10. 星座是按阴历还是阳历
  11. arch linux 安装 键盘,Arch Linux安装
  12. 导入数据库sql 文件乱码
  13. CAD绘图设计效率慢?这些外挂神器帮你1小时完成3小时的工作!
  14. jQuery 仿抖音时钟罗盘转动效果
  15. vbscript for 转 php for,VBS教程:VBScript 基础-使用循环语句
  16. 自定制shell提示符
  17. 网站文章采集与伪原创技巧
  18. 运维工程师手把手教你提高网站的安全性
  19. 在公共Wi-Fi上保持安全的12种方法
  20. 4个亲测有效的视频压缩工具,压缩视频体积小、画质清晰

热门文章

  1. 02ODBC基本概念
  2. 有时候,996确实会让你麻木
  3. 前端必须掌握的经典布局:“双飞翼布局”
  4. 数据库 | OMIM (在线人类孟德尔遗传)数据库简介
  5. 上海药物所揭示KRAS突变肿瘤的分子分型和精准治疗新策略
  6. 学习生信的系列教程 | 留言您是如何学习生信的免费获取北大出版《Python数据分析》书籍...
  7. 大名鼎鼎的电影胶片滤镜--DxO FilmPack 5 mac
  8. java socket发送定长报文_socket编程
  9. Python将绝对路径转换为相对路径方法实例
  10. java集合多个最大值_Java 8 Stream 求集合元素每个属性的最大值