全排列 递归

#全排列 递归写法

def permute(nums,l,r):if l==r: #如果l=r 说明指剩下最后一个元素了 返回当前列表print(''.join(nums)) #字符串连接else:for i in range(l,r+1): #进入循环#交换i l 两个元素位置nums[l],nums[i]=nums[i],nums[l]#递归 调用permute(nums,l+1,r) #l+1 表示下一个元素#再交换回来nums[l],nums[i]=nums[i],nums[l]if __name__ == '__main__':nums=['1','2','3']permute(nums,0,len(nums)-1)使用 nums = ['1', '2', '3'] 这个例子,我们可以详细解释 permute 函数是如何运行的。
首先,我们初始化 nums 为一个包含三个元素的列表:['1', '2', '3']。我们的目标是生成这三个元素的所有可能排列。
调用 permute(nums, 0, 2),其中 0 是左边界,2 是右边界。
1. 当 l = 0, r = 2○ i = 0:交换 nums[0] 和 nums[0](实际上没有变化),然后递归调用 permute(nums, 1, 2)。■ l = 1, r = 2 时,会生成 ['1', '2', '3']['1', '3', '2'] 的排列。当 l = 1, r = 2 时,我们考虑 nums 列表中索引为 12 的元素,即 '2''3'。此时,'1' 已经被固定在列表的第一个位置,所以我们只需要考虑 '2''3' 的排列。
递归调用 permute(nums, 1, 2) 的过程如下:
1. 初始状态:nums = ['1', '2', '3'],此时 l = 1 指向 '2',r = 2 指向 '3'2. i = 1(即 l 的值):○ 不进行交换,因为 nums[l](即 '2')和 nums[i](也是 '2')相同。○ 递归调用 permute(nums, l + 1, r),此时 l + 1 = 2,r 仍为 2。由于 l 和 r 相等,说明只剩下一个元素需要排列,直接打印出这个排列。■ 内部递归调用:nums 仍为 ['1', '2', '3'],因为 l 和 r 相等,所以直接打印 ['1', '2', '3']。○ 递归返回后,没有交换操作,因为 i 和 l 相同。
3. i = 2:○ 交换 nums[l](即 '2')和 nums[i](即 '3'),nums 变为 ['1', '3', '2']。○ 递归调用 permute(nums, l + 1, r),此时 l + 1 = 2,r 仍为 2。同样地,因为 l 和 r 相等,直接打印出这个排列。■ 内部递归调用:nums 为 ['1', '3', '2'],直接打印 ['1', '3', '2']。○ 递归返回后,将 nums[l] 和 nums[i] 交换回来,恢复 nums 为 ['1', '2', '3']。
所以,当 l = 1, r = 2 时,通过递归调用和元素交换,我们生成了 ['1', '2', '3']['1', '3', '2'] 这两个排列。这是因为 '1' 已经被固定在第一个位置,我们只需要考虑剩余两个元素的排列情况。后续也是如此○ i = 1:交换 nums[0] 和 nums[1],得到 ['2', '1', '3'],然后递归调用 permute(nums, 1, 2)。■ l = 1, r = 2 时,会生成 ['2', '1', '3']['2', '3', '1'] 的排列。○ i = 2:交换 nums[0] 和 nums[2],得到 ['3', '2', '1'],然后递归调用 permute(nums, 1, 2)。■ l = 1, r = 2 时,会生成 ['3', '2', '1']['3', '1', '2'] 的排列。
在每次递归调用之后,我们都会将元素交换回它们原始的位置,以确保在下一次循环中,我们可以正确地处理下一个元素。
这样,permute 函数通过不断地交换元素和递归调用自身,最终生成了 ['1', '2', '3']['1', '3', '2']['2', '1', '3']['2', '3', '1']['3', '2', '1']['3', '1', '2'] 这六个全排列。

#2.用 itertools模块

import itertools
lst=list(itertools.permutations([1,2,3]))
for item in lst:print(item)

全排列问题 递归实现 有重复情况

‘’‘如果有重复元素,为了避免生成重复的排列,可以在递归之前进行判断,确保相同的元素不会交换位置。在进行交换之前,
检查是否存在相同的元素,如果存在则跳过当前循环。’‘’
可以用一个集合来保存已经交换过的元素 然后进行判断 如果集合里面有当前元素 说明该元素是重复元素 直接跳过

def permute(nums, l, r):if l == r:  # 如果l=r 说明指剩下最后一个元素了 返回当前列表print(''.join(nums))  # 连接else:visited=set()  #用集合记录已经交换过的元素for i in range(l, r + 1):  # 进入循环if nums[i] in visited: #如果在集合里面 表示已经交换过 跳过continue# 交换i l 两个元素位置nums[l], nums[i] = nums[i], nums[l]# 递归 调用permute(nums, l + 1, r)  # l+1 表示下一个元素# 再交换回来nums[l], nums[i] = nums[i], nums[l]visited.add(nums[i])if __name__ == '__main__':nums = ['1', '2', '2']permute(nums, 0, len(nums) - 1)

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

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

相关文章

js中“==” 和“===”的区别

在JavaScript中, 和 是两种比较操作符,它们的区别在于它们进行比较时对数据类型的处理方式不同。 “”(相等)操作符: “” 操作符在比较两个值时会进行类型转换,如果两个值的数据类型不同,它会…

MyBatis3源码深度解析(十一)MyBatis常用工具类(四)ObjectFactoryProxyFactory

文章目录 前言3.6 ObjectFactory3.7 ProxyFactory3.8 小结 前言 本节研究ObjectFactory和ProxyFactory的基本用法,因为它们在MyBatis的源码中比较常见。这里不深究ObjectFactory和ProxyFactory的源码,而是放到后续章节再展开。 3.6 ObjectFactory Obj…

朴素贝叶斯 | 多分类问题

目录 一. 贝叶斯公式的推导二. 朴素贝叶斯1. 离散的朴素贝叶斯朴素贝叶斯导入示例 离散的朴素贝叶斯训练 2. 连续的朴素贝叶斯3. 伯努利朴素贝叶斯4. 多项式朴素贝叶斯4.1 Laplace平滑4.2 Lidstone平滑 三. 概率图模型1. 贝叶斯网络(Bayesian Network)1.1 全连接贝叶斯网络1.2 …

中国城市统计年鉴、中国县域统计年鉴、中国财政统计年鉴、中国税务统计年鉴、中国科技统计年鉴、中国卫生统计年鉴​

统计年鉴是指以统计图表和分析说明为主,通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年鉴,则是研究者常用的途径。目前国…

redis在微服务领域的贡献,字节跳动只面试两轮

dubbo.registry.addressredis://127.0.0.1:6379 注册上来的数据是这样,类型是hash /dubbo/ s e r v i c e / {service}/ service/{category} 如 /dubbo/com.newboo.sample.api.DemoService/consumers /dubbo/com.newboo.sample.api.DemoService/providers has…

软件设计师14--死锁资源数计算

软件设计师14--死锁资源数计算 考点1:进程管理 - 死锁问题例题: 考点1:进程管理 - 死锁问题 所谓死锁,是指两个以上的进程相互要求对方已经占有的资源导致无法继续运行下去的现象。 死锁四大条件: 互斥保持和等待不…

Prompt Learning:人工智能的新篇章

开篇:AI的进化之旅 想象一下,你正在和一位智能助手对话,它不仅理解你的问题,还能提出引导性的问题帮助你更深入地思考。这正是prompt learning的魔力所在——它让机器学习模型变得更加智能和互动。在这篇博客中,我们将…

安装MySQL8.0及以上版本操作步骤

关于mysql安装过程中命令mysqld --initialize --console出错的解答 C:\mysql-8.3.0-winx64\bin>mysqld --initialize --usermysql --console 2024-03-12T11:21:23.201387Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 2024-03-12T11:21:23.2068…

【05】消失的数字

hellohello~这里是土土数据结构学习笔记🥳🥳 💥个人主页:大耳朵土土垚的博客 💥所属专栏:C语言函数实现 感谢大家的观看与支持🌹🌹🌹 有问题可以写在评论区或者私信我哦…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)

显示一段文本的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…

论文阅读——ViTAE

ViTAE: Vision Transformer Advanced by Exploring Intrinsic Inductive Bias ViTAE旨在将细胞神经网络中固有的IB引入视觉转换器。如图2所示,ViTAE由两种类型的细胞组成,即RC和NC。RC负责将多尺度上下文和局部信息嵌入到令牌中,NC用于进一步…

AUTOSAR软件配置(3):MCAL下载安装

前言 所有的NXP软件的下载安装都是需要自己在官网去注册账号的 中文的NXP官方网址:恩智浦半导体官方网站 | NXP 半导体 注:本文指导安装教程将以S32K144平台为例展开。 下载 找到下载入口的指引 然后在左侧的导航栏找到AUTOSAR 然后选择4.2版本 在…

java-集合工具类Collections

我们在使用它的时候记得导包 常见API 我们就简单看看第一第二个方法,代码如下,其余的知道用就行

MySQL命令--使用mysqldump导出导入数据库

原文网址:MySQL命令--使用mysqldump导出导入数据库_IT利刃出鞘的博客-CSDN博客 简介 本文介绍mysql使用mysqldump命令导出导入数据库的方法。 本方法是导入导出数据库最完美的方法。其他用Navicat可视化的方法全都不完美,经常会有导入失败的问题。 导…

【Preprocessing数据预处理】之Pipeline

在机器学习中,管道(Pipeline)是一种工具,用于将数据预处理、特征选择、模型构建等一系列步骤封装成为一个整体流程。这样做的好处是可以简化代码,避免数据泄露,并使模型的训练和预测过程更加高效和可重复。…

信息系统项目管理师--沟通管理

IT 项⽬成功有关的最重要的四个因素是:主管层的⽀持、⽤户参与、有经验的项⽬经理和清晰的业务⽬标 项⽬沟通管理是确保及时、正确地产⽣、收集、分发、存储和最终处理项⽬信息所需的过程 项⽬沟通管理由两部分组成:⼀是制定策略,确保沟通对…

leetcode一天一题-第1天

为了增加自己的代码实战能力,希望通过刷leetcode的题目,不断提高自己,增加对代码的理解,同时开拓自己的思维方面。 题目名称:两数之和 题目编号:1 题目介绍: 给定一个整数数组 nums 和一个整数…

中介者模式(Mediator Pattern)

中介者模式 说明 中介者模式(Mediator Pattern)属于行为型模式,又称为调解者模式或调停者模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立…

Selenium WebDriver 中用于查找网页元素的两个方法

这里提供了 Selenium WebDriver 中用于查找元素的两个方法:find_element() 和 find_elements()。 find_element(byid, value: Optional[str] None) → selenium.webdriver.remote.webelement.WebElement 这个方法用于查找满足指定定位策略(By strategy&…

【AI大模型应用开发】【LangChain系列】9. 实用技巧:大模型的流式输出在 OpenAI 和 LangChain 中的使用

大家好,我是同学小张,日常分享AI知识和实战案例欢迎 点赞 关注 👏,持续学习,持续干货输出。v: jasper_8017 一起交流💬,一起进步💪。微信公众号也可搜【同学小张】 🙏 本…