当前位置: 首页 > news >正文

搜索与回溯算法②

求0-9的数字可以组成的所有k 位数。

def backtrack(start, path, k, n, results):"""核心函数。:param start: 下一个添加的数字的起始位置:param path: 当前构建的路径,代表一个组合:param k: 组合中所需的数字个数:param n: 可选数字的最大值:param results: 存储所有有效组合的列表"""# 如果路径长度等于k,说明找到了一个有效的k位数,将其加入结果列表if len(path) == k:results.append("".join(map(str, path)))return# 从start开始,尝试每个可能的数字for i in range(start, n + 1):# 添加当前数字到路径path.append(i)# 继续递归填充下一个数字,注意数字可以重复使用,所以起始位置仍然是startbacktrack(start, path, k, n, results)# 回溯,移除路径中的最后一个数字,尝试下一个可能的数字path.pop()def generate_combinations(k, n=9):"""生成所有可能的k位数组合。:param k: 组合中所需的数字个数:param n: 可选数字的最大值,默认为9:return: 包含所有k位数的列表"""results = []  # 存储所有组合的结果列表backtrack(0, [], k, n, results)  # 从数字0开始进行回溯return results# 示例:生成所有3位数
k_digit_numbers = generate_combinations(3)
for number in k_digit_numbers:print(number)

        在这个案例中,`generate_combinations` 函数是主函数,它初始化结果列表并开始回溯过程。`backtrack` 函数是核心,它尝试所有可能的数字,并在找到一个有效的`k`位数时将其存储。通过递归调用自身,`backtrack` 函数能够探索所有可能的组合。当路径(`path`)达到长度`k`时,我们就找到了一个有效的组合,并将其添加到结果列表中。

        在每次递归调用之后,我们通过`path.pop()`来回溯,这样就可以去掉最后一个数字并尝试其他可能的数字。

        这个代码片段将生成所有可能的`k`位数,其中数字可以重复,并且是从0开始的。如果想要不重复的数字或者有其他特定的约束条件,可以修改`backtrack`函数来适应这些规则。

关于回溯和剪枝

此案例中,回溯和剪枝的操作如下所述:

        回溯(Backtracking):

        a.回溯是在`backtrack`函数中发生的,特别是在递归调用之后,通过`path.pop()`移除路径上的最后一个数字。这样做是为了撤销上一步的操作,可以尝试其他可能的数字,这是回溯算法的基本特征。

        b.回溯算法通过递归来实现深度优先搜索,在搜索空间树的每一层尝试所有可能的选项。当它达到一个节点(在这个例子中是一个特定长度的数字组合),它会检查节点是否满足约束(在这里是长度等于`k`)。如果满足,则记录下来;如果不满足,则返回上一层,尝试其他选项。

path.append(i)  # 尝试加入一个数字到当前路径backtrack(start, path, k, n, results)  # 递归调用以继续构建路径path.pop()  # 移除最后一个元素,这是回溯的体现

        剪枝(Pruning):

       a. 在这个特定的例子中,剪枝不是特别明显,因为我们要生成所有可能的组合,而且没有明确的约束条件来剪除某些分支。但是,可以认为在达到组合的长度等于`k`时停止进一步递归的操作是一种隐性的剪枝。这是因为任何超过`k`长度的路径都不会是有效的解,所以不再继续在那个方向上探索。

       b. 剪枝通常用于减少搜索空间,避免不必要的计算。在其他问题中,如果有额外的约束条件,比如数字不能重复,或者组合必须满足某种特定的性质,那么需要在递归之前检查这些条件,并且只在条件满足的情况下继续递归。

        在这段代码中,由于我们要求所有可能的`k`位数,没有进一步的约束条件,所以没有进行显式的剪枝操作。如果要添加剪枝,我们需要在递归调用`backtrack`之前加入检查逻辑,以确保只有满足条件的分支才会被探索。

http://www.lryc.cn/news/254009.html

相关文章:

  • Centos图形化界面封装OpenStack Ubuntu镜像
  • 使用Jmeter进行http接口测试怎么做?
  • 创建腾讯云存储桶---上传图片--使用cos-sdk完成上传
  • 12.3_黑马MybatisPlus笔记(上)
  • 智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 全息图着色器插件:Hologram Shaders Pro for URP, HDRP Built-in
  • Python Opencv实践 - 简单的AR项目
  • Java不可变集合
  • openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复
  • 一文读懂中间件
  • 【编程基础心法】「设计模式系列」让我们一起来学编程界的“兵法”设计模式(序章)
  • 技术阅读周刊第第8️⃣期
  • HTML程序大全(2):通用注册模版
  • 【循环结构 for、break、continue高级用法】
  • JAVA网络编程——BIO、NIO、AIO深度解析
  • Linux高级系统编程-3 进程
  • ES-ELSER 如何在内网中离线导入ES官方的稀疏向量模型(国内网络环境下操作方法)
  • Excel 使用技巧
  • Hadoop学习笔记(HDP)-Part.03 资源规划
  • 一个最新国内可用的免费GPT4,Midjourney绘画网站+使用教程
  • 深入了解Java8新特性-日期时间API之ZonedDateTime类
  • 使用Vue写一个日期选择器
  • 19、pytest通过mark标记测试函数
  • Linux环境变量与命令行参数
  • jQuery实现3D轮播图
  • Java面试题(每天10题)-------连载(43)
  • Python高级数据结构——并查集(Disjoint Set)
  • pytorch学习9-优化器学习
  • MySQL之锁
  • 今日现货黄金最新建议