Python|“套娃”算法-递归算法解决全排列

简介: Python|“套娃”算法-递归算法解决全排列

1 什么是递归?

什么是递归?晦涩难懂而又有学术气息的解释网上到处都有。今天就为大家带来一个‘船新版本’。

相信不少人在各种社交APP上都见过‘禁止套娃’的评论,而什么是套娃呢?套娃其实是俄罗斯是特产的木制玩具,一般由多个相同图案的空心木娃娃一个套一个的组成,一般在六个以上。由此 ‘套娃’这个梗的意思也就清晰了:在各种社交网站或视频下方评论区跟人争论时使用重复类似的语言。

1 递归

有个笑话是这样的:

记者:你放羊为了什么?

放羊娃:赚钱

记者:你赚钱为了什么?

放羊娃:娶媳妇

记者:你娶媳妇为了什么?

放羊娃:生娃

记者:生了娃干什么

放羊娃:放羊。

看了上面的例子,再结合递归的‘调用函数本身’,就理解了递归的含义。通俗讲就是 ‘为所欲为’ 之 ‘为所欲为’ 之 ‘为所欲为’ ……

2 递归全排列

在明白了递归含义后,就来做一个小小的实践:用代码输出[1,2,3,4]数列的全部排列情况(全排列)

思路一

按照数学题思路:

第一个数有4种情况(1234),第二个数有3种(除开第一个数),第三个数有2种(除开第一个数和第二个数),第四个数有1种(剩下的数)

因此套用4层循环就可以解决。但是如果不知道列表的长度,此方法就不成立。

思路二

既然理解了递归,就用递归的方法。可以认为是以n1依次遍历列表)为头部,加上[n2, n3,n4 ,……nn]的全排列,而[n2,n3 ,n4 ,……nn]的全排列可以看成以为头部,加上[n3,n4 ,……nn]的全排列……剩下的就是‘套娃’了,一直套到列表长度为1

步骤

1.先定义full_array函数,并设置递归结束条件(即列表长度为1时);

def full_array(List):

    if len(List)==1:

        return [List]

2.遍历列表作为头部,并生成下一个 ‘去头部的列表’ ;

for i in range(len(List)):

    array=List[:i]+List[i+1:]

3.对递归后的‘去头部列表’遍历,并与前面所删除的部分相加。

for i in range(len(List)):

    array=List[:i]+List[i+1:]

    for ii in full_array(array):

         Mid=[List[i]]+ii

         Result.append(Mid)    

完整代码:

def full_array(List):

    Result=[]

    if len(List)==1:

        return [List]

    else:

        for i in range(len(List)):

            array=List[:i]+List[i+1:]

            for ii in full_array(array):

                Mid=[List[i]]+ii

                Result.append(Mid)

    return Result        

print(full_array([1,2,3]))

3 总结

递归就是‘套娃’,一层套一层,但必须设置一个结束条件,就像‘套娃’一定会打开最后一个,递归也必须有最后一层,防止无线递归。而一般也规定了递归最大深度,一旦超过栈就会溢出。递归对不同的问题,使用的位置也不同,因此应该学会递归的思想,而不是狭隘地认为自己仅会阶乘运算,就算得上掌握了递归算法。



目录
相关文章
|
7天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
116 55
|
22天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
125 67
|
22天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
115 61
|
24天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
16天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
98 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
23天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
22天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
16天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
22天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
2天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
下一篇
DataWorks