建议参考:https://blog.csdn.net/sinat_27908213/article/details/80599460#commentBox
在此基础上,我建议以二叉树(不懂的先看二叉树)的思想来理解回溯算法。
回溯算法采用递归来实现,其实和遍历二叉树一样,只不过回溯算法通过约束条件进行裁剪截枝,最终根据约束条件而得到了自己想要的结果(解)
括号生成示例:
/**
* Copyright (C), 2018-2019, LMaWC
* FileName: Test1
* Author: neo
* Date: 2019/3/27 14:27
* Description: ceshi
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com;
import java.util.ArrayList;
import java.util.List;
/**
* 〈一句话功能简述〉<br>
* 〈ceshi〉
*
* @author neo
* @create 2019/3/27
* @since 1.0.0
*/
public class Test1 {
public static void main(String[] args) {
// 有哪些已知条件
int n = 3;
// 全局变量,创建一个容器来存结果,
List<String> list = new ArrayList<String>();
// 临时变量
String cur_str = "";
// 约束条件
int left = n, right = n;
// 调用递归函数
parentheses(cur_str, list, left, right);
// 打印容器存储的结果
System.out.println(list.toString());
}
// 生成括号,要以二叉树的思想来理解
// 传入临时变量、全局变量,约束条件
public static void parentheses(String cur_str, List<String> list, int left, int right) {
// 递归结束条件
if (left == 0 && right == 0) {
list.add(cur_str);
} else {
// 通过if语句来进行条件选择,进行截枝(裁剪)
/*
* 在进行生成时,有两个约束条件,1.left要大于0 2.right要大于left
* */
if (left > 0) { // 说明可以继续往深了探索(左子树)
parentheses(cur_str + "(", list, left - 1, right);
}
if (right > left) { // 说明可以往右子树进行探索
parentheses(cur_str + ")", list, left, right - 1);
}
/*补充:这两个if语句 在二叉树里属于同一层即同一深度*/
}
}
}
示例结果:[((())), (()()), (())(), ()(()), ()()()]