递归回溯法经典——组合(python)

关于递归,虽然每次看代码都能明白别人代码的大体意思,但实际上当自己动手写的时候,往往没有头绪。

为了解决这个问题,我感觉我们需要深入探究模拟别人代码的全过程,了解递归回溯的基本像树一样的全过程,才能帮助我们更好的理解,当然写这篇文章也是给自己一个记录复习,可能无法实质性的帮助到大家哈哈哈哈

原题链接为:77. 组合 - 力扣(LeetCode)

把组合问题抽象为如下树形结构

然后下面的回溯三部曲大家应该也明白,我再赘述一下:

  • 递归函数的返回值以及参数
  • 回溯函数终止条件
  • 单层搜索的过程

这里我直接贴出卡尔老师的代码,因为代码的浅理解也比较容易

class Solution:def combine(self, n: int, k: int) -> List[List[int]]:res = []path = []def backtrack(n, k, StartIndex):if len(path) == k:res.append(path[:])returnfor i in range(StartIndex, n + 1):path.append(i)backtrack(n, k, i+1)path.pop()backtrack(n, k, 1)return res

下面也就是本博客主要的出发点:模拟程序运行的过程——

建议大家结合着画着二叉树来模拟

当n=4和k=2时,程序的完整具体运行过程如下:

  1. 初始化res为空列表,初始化path为空列表。

  2. 调用backtrack函数,传递参数n=4,k=2,StartIndex=1。

  3. 判断如果当前path列表中的元素数量等于k,将其复制一份并添加到res列表中,并立即返回。

  4. 进入for循环,循环变量i从StartIndex(1开始)到n+1(5),依次取值为1, 2, 3, 4.

  5. 在每个for循环迭代中,将变量i添加到path列表中。

  6. 调用backtrack函数,传递参数n=4,k=2,StartIndex=i+1(i的初始值为1,则第一次调用将传递2作为StartIndex参数)。

  7. 重复步骤3到步骤6,直到path列表中的元素数量等于k。

  8. 当path列表中的元素数量等于k时,将其复制一份并添加到res列表中,并立即返回上一级backtrack函数的调用。

  9. 回溯,将最后一个添加到path列表中的元素弹出。

  10. 回到步骤5,继续循环。重复步骤5到步骤9,直到所有迭代结束。

  11. 返回res列表作为输出结果。

接下来是更具体的过程以下为chatgpt所写,可能略有出入,但大体的思路见解可以供我们参考,当我们理解里面的总体过程,我们也就对回溯法有了进一步的认识

当 n=4, k=2 时,程序的运行过程如下:

  1. 首先初始化结果列表 res 和路径列表 path。

    res = [] path = []

  2. 调用 backtrack 函数,并传入参数 n=4, k=2, StartIndex=1。

    执行 backtrack(n=4, k=2, StartIndex=1)。

  3. 判断当前路径长度是否等于 k,如果是则将当前路径添加到结果列表中并返回。

  4. 对于循环中的每个 i,执行以下操作:

    a. 将 i 添加到路径列表 path 中。

    b. 递归调用 backtrack 函数,传入参数 n、k、i+1。

    • 当 i=1 时,执行 backtrack(n=4, k=2, StartIndex=2)。

      • 判断当前路径长度是否等于 k,长度为 1 不等于 k,继续执行。

      • 对于循环中的每个 j,在路径中加入 j 并递归调用 backtrack 函数,传入参数 n、k、j+1。由于此时 k=2,因此只需要找到两个数即可,所以 j 的取值范围为 [2, 4]。

        • 当 j=2 时,执行 backtrack(n=4, k=2, StartIndex=3)。

          • 判断当前路径长度是否等于 k,长度为 2 等于 k,将路径 [1,2] 添加到结果列表中。
        • 当 j=3 时,执行 backtrack(n=4, k=2, StartIndex=4)。

          • 判断当前路径长度是否等于 k,长度为 2 等于 k,将路径 [1,3] 添加到结果列表中。
        • 当 j=4 时,由于此时已经没有元素可以添加到路径中,直接返回。

    • 当 i=2 时,执行 backtrack(n=4, k=2, StartIndex=3)。

      • 判断当前路径长度是否等于 k,长度为 1 不等于 k,继续执行。

      • 对于循环中的每个 j,在路径中加入 j 并递归调用 backtrack 函数,传入参数 n、k、j+1。由于此时 k=2,因此只需要找到两个数即可,所以 j 的取值范围为 [3, 4]。

        • 当 j=3 时,执行 backtrack(n=4, k=2, StartIndex=4)。

          • 判断当前路径长度是否等于 k,长度为 2 等于 k,将路径 [2,3] 添加到结果列表中。
        • 当 j=4 时,由于此时已经没有元素可以添加到路径中,直接返回。

    • 当 i=3 时,执行 backtrack(n=4, k=2, StartIndex=4)。

      • 判断当前路径长度是否等于 k,长度为 1 不等于 k,继续执行。

      • 对于循环中的每个 j,在路径中加入 j 并递归调用 backtrack 函数,传入参数 n、k、j+1。由于此时 k=2,因此只需要找到两个数即可,所以 j 的取值范围为 [4]。

        • 当 j=4 时,由于此时已经没有元素可以添加到路径中,直接返回。
    • 当 i=4 时,由于此时已经没有元素可以添加到路径中,直接返回。

  5. backtrack 函数执行完毕后,将结果列表 res 返回。

    所以最终的输出结果为 [[1, 2], [1, 3], [2, 3], [1, 4], [2, 4], [3, 4]]。

参考大佬的这篇文章:代码随想录 (programmercarl.com)https://www.programmercarl.com/0077.%E7%BB%84%E5%90%88.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[云炬ThinkPython阅读笔记]1.4 算术运算符

最后,运算符 * 执行乘方运算;也就是说,它将某个数字乘以自身相应的次数: ✞ >>> 6**2 6 42 ✆ 某些语言使用 ^ 运算符执行乘方运算,但是在 Python 中,它却属于一种位运算符,叫 做 XOR…

《蓝桥小记》 2018-04-01

蓝桥杯省赛从9:00-13:00历时4个小时,今年的题和去年的题差不多有易有难,整体来说今年出的题即使做不出来也会让你觉得比较生动有趣味性,可能是为了吸引更多的人参加吧。 第一题:求2000/5/4是一年的第几天,这道题用excel稍微计算一…

[蓝桥小记]蓝桥杯参赛经历分享

《蓝桥小记》 蓝桥杯省赛从9:00-13:00历时4个小时,今年(2018年)的题和去年的题差不多有易有难,整体来说今年出的题即使做不出来也会让你觉得比较生动有趣味性,可能是为了吸引更多的人参加吧。 第一题:求2000/5/4是一年的第几…

C++:蓝桥杯-22真题-最大数字

C:蓝桥杯-22真题-最大数字 自我制定规则无法完全贪心遍历只得92分, 使用dfs深度优先搜索进行贪心遍历 文章目录 C:蓝桥杯-22真题-最大数字题目1、自我规则,只得92分,随便看看代码 2、dfs贪心方法代码 总结 题目 1、自我规则,只得92分,随便看…

移动广告效果监测,App推广广告投放归因工具

Xinstall移动广告实时监控投放效果,精准监测各渠道曝光量、点击量、下载量、转化率等全链路核心数据,提供多平台数据聚合查看功能、报表加密分享功能、防作弊保护功能。帮助移动广告主量化移动端推广活动效果,实时追踪、运营、优化广告链路各…

facebook海外社交媒体广告平台的几种广告形式和类型

facebook海外社交媒体广告平台的几种广告形式 1、图像(Image) 图像是最简洁的广告方式,附带一些文字和CTA按钮。关于想做海外社交媒体的企业来讲,在投放 此类广告时,最好是简洁地展示产品图片。 2、视频&#xff08…

2022中国广告行业研究报告:投放方式呈现九大新变化

文:任泽平团队 导读 广告行业迎来大变局,传统媒体势弱,移动互联网新媒体快速成为主流,背后的根本逻辑得用户关注者得天下。近年,随着消费者心理精神需求升级、科技快速进步以及市场环境迅速变化,我国的广…

广告行业中那些趣事系列63:使用chatgpt类大模型进行文本分类任务

导读:本文是“数据拾光者”专栏的第六十三篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要介绍了使用chatgpt类大语言模型进行文本分类任务,对于希望使用chatgpt类大语言模型上进行数据标注、文本分类和关键词抽取等…

GPT-4竟被CS学生「开源」了!

Datawhale开源 开源:免费GPT-4,编辑:新智元 【导读】最近,一名来自欧洲的计算机系学生竟然把GPT-4给「开源」了。利用OpenAI加持的网站的API,开发者即可免费体验GPT-3.5/GPT-4。对此,OpenAI紧急发邮件警告…

写公开信可别等被喷,才发现其实可以这样

正文共 1022 字,阅读大约需要 4 分钟 公务员必备技巧,您将在4分钟后获得以下超能力: 快速生成公开信 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Le…

IDE装上ChatGPT,这款编辑器真的做到可以自动写代码了,彻底炸裂!!

上一篇:用ChatGPT画了亿些小姐姐,被惊艳到了!! 介绍 Cursor 是集成了 GPT-4 的 IDE 工具,目前免费并且无需 API Key,支持 Win、Mac、Linux 平台,可以按要求生成代码,或者让 AI 帮助优…

科大讯飞回应薪酬回溯制度;OpenAI宣布开放API,开发人员可将ChatGPT集成到自己产品;Godot 4.0发布|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

ubuntu18.04设置自启动踩坑贴(拿来即用)---全网搜索半天都没有,ChatGPT回答都是有问题的!!

前言:其实很简单,全网的资料实在坑太多(无语),有一篇还不错,我大多数借鉴这篇https://cloud.tencent.com/developer/article/1803805,但直接用貌似也不通,这边记录了我的实测可跑通版…

centos7 设置ssh_key 登陆 公钥与密钥,借助工具生成 .ppk 文件,

这里选择不对root进行直接操作,也就是会出现各个用户所对应的key 1.新增登陆用户,分配root权限组 [rootlocalhost ~]# adduser zhw2 [rootlocalhost ~]# passwd zhw2 Changing password for user zhw2. New password: BAD PASSWORD: The password is shorter than…

Gitlab设置ssh密钥详解

系列文章目录 文章目录 系列文章目录前言一、创建ssh key1.在客户端查看有没有密钥2.在客户端查看当前git的用户名和邮箱3.输入密码创建ssh key4.在ssh文件夹下有两个文件,一个是私钥,以pub结尾的为公钥,把公钥添加到gitlab中的ssh密钥中5.回…

SSH公私密钥模式,Git配置使用

Git关联验证本地和远程仓库的方式有: -HTTP模式(需要存储账号密码) 如:https://gitee.com/BB-X/git-idea-test.git -SSH模式(需要匹配公私秘钥) 如:gitgitee.com:BB-X/git-idea-test.git 1、生成公私秘钥对 2、在远程托管平台账号中配置公钥 …

git设置SSH密钥

Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置。git设置密钥的步骤如下: 步骤1 在客户端查看有无密钥 命令行输入: cd ~/.ssh如果提示如下图所示,就说明还没有创建密钥…

Git密钥配置

一、下载并安装Git 官网下载地址点击这里 二、打开git bash 选择一个空文件夹,右键选择Git Bash Here 三、配置密钥 在Git Bash界面输入git命令 初始化自己的用户名和邮箱 git config --global user.name "输入你的用户名" git config --global u…

HLS新手入门教程

文章目录 HLS学习笔记1. 什么是HLS2. HLS开发流程3. HLS基本语法3.1. #pragma HLS3.2. HLS数据类型3.3. HLS模块定义3.4. 数组分区3.5. 流水线优化3.6. 组合逻辑优化3.7. 一些基本概念3.8. 完整示例3.8.1. 矩阵乘法3.8.2. 函数调用和循环3.8.3. 流水线和并行化指令 4. HLS高级语…