【算法套路】-【回溯篇】【回溯三步法】

【算法套路】-【回溯篇】

前言

本文是参考·【代码随想录】·大佬的关于回溯算法,你该了解这些!,希望在使用回溯算法解决问题时能够给自己一点启发


回溯法的意思

回溯就是一种暴力搜索方法,穷举所有的可能。回溯是递归的副产品,只要有递归就有回溯。

【代码随想录】认为:回溯能够解决的所有问题都能够抽象为树形结构(多叉树)。注意,回溯法解决的是在集合中递归地查找子集,集合大小就是树的宽度,递归的深度就是树的深度。着重注意:在集合中递归查找


回溯的套路

与递归一样也可以总结为三步法,递归的三步法看这里:【算法套路】-【递归篇】【递归三要素】

1、回溯函数参数和返回值

2、终止条件

3、回溯搜索逻辑

下面分别阐述三要素:

1、回溯函数的返回值一般为void,但是参数没有二叉树递归那么容易确定,一般就是先写逻辑,需要什么参数再传进来

2、终止条件也要因题而异。但是既然前面说了使用回溯解决的问题都能抽象为树形结构,那么搜索到叶节点就意味着必须返回上一级了(即开始回溯),对该节点采取某种操作(比如存起来)

3、回溯搜索逻辑:回溯法是在集合中递归搜索,集合大小就是数的宽度,递归的深度就是树的深度。这里上一张【代码随想录】大佬的图示:

在这里插入图片描述

按照三步法,回溯法代码模板如下:

void backtracking(参数) {//1:函数参数及返回值
    if (终止条件) {	//2:终止条件
        存放结果;
        return;
    }
	//3:回溯搜索逻辑
    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

在第三步回溯搜索逻辑中,for循环可以看做是横向遍历集合,调用回溯函数(也可以认为是递归函数)是纵向遍历,通过一横一纵实现穷举。

与递归三步法不一样的是,回溯一定要撤销结果

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值