欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

1 什么是递归?

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

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

图1 递归

有个笑话是这样的:

记者:你放羊为了什么?

放羊娃:赚钱

记者:你赚钱为了什么?

放羊娃:娶媳妇

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

放羊娃:生娃

记者:生了娃干什么

放羊娃:放羊。

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

2 递归全排列

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

思路一

按照数学题思路:

第一个数有4种情况(1,2,3,4),第二个数有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 总结

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

END

主  编   |   王文星

责  编   |   梁   林

 where2go 团队


   

微信号:算法与编程之美

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

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

  1. python迷宫问题算法_Python解决走迷宫问题算法示例

    本文实例讲述了Python解决走迷宫问题算法.分享给大家供大家参考,具体如下: 问题: 输入n * m 的二维数组 表示一个迷宫 数字0表示障碍 1表示能通行 移动到相邻单元格用1步 思路: 深度优先 ...

  2. DNSSEC?禁止套娃!

    简介 DNSSEC是DNS安全拓展,主要思想是通过在DNS记录中添加加密签名,从而为DNS解析流程提供来源可认证和数据完整性的保障. 本文的目的是帮助大家大致理解DNSSEC的工作流程 建议读者先掌握 ...

  3. 怎样用python批量处理文件夹_套娃式文件夹如何通过Python批量处理

    前言 在我对项目组的一些训练图像进行预处理的时候,发现处理的图像是分好了类,在文件夹里的文件夹里,套娃式存储的,所以对我批处理,以及按原文件夹规则进行存储的时候,就会造成很大困扰 但通过下面几个函数的 ...

  4. python全排列问题_Python基于回溯法子集树模板解决全排列问题示例

    本文实例讲述了Python基于回溯法子集树模板解决全排列问题.分享给大家供大家参考,具体如下: 问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模 ...

  5. php狼和兔子算法,PHP基于递归算法解决兔子生兔子问题php技巧

    这篇文章主要介绍了PHP基于递归算法解决兔子生兔子问题,结合实例形式分析了兔子生兔子问题的php面试题采用循环与递归两种思路的解决方法,需要的朋友可以参考下 本文实例讲述了PHP基于递归算法解决兔子生 ...

  6. Python实现A*算法解决N数码问题

    Python实现A*算法解决N数码问题 A*算法的描述 A*算法的步骤 问题描述 代码以及测试结果 算法优势 算法存在一些不足 A*算法的描述 A*算法是BFS的一个变种,它把原来的BFS算法的无启发 ...

  7. 集货运输优化:数学建模步骤,Python实现蚁群算法(解决最短路径问题), 蚁群算法解决旅行商问题(最优路径问题),节约里程算法

    目录 数学建模步骤 Python实现蚁群算法(解决最短路径问题) 蚁群算法解决旅行商问题(最优路径问题) 节约里程算法

  8. python:算法——递归算法

    python:算法--递归算法 1.什么是递归算法 ​ 在计算机中,程序调用自身的编程技巧我们称之为递归算法.那么再通俗一点来讲就是:在某个python文件中,有一个函数,这个函数可以在自己的函数体内 ...

  9. 汉诺塔 = 套娃 ?

    递归算法:是一种直接或者间接地调用自身的算法.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归过程一般通过函数或子过程来实现. 递归算法的实质:把问 ...

最新文章

  1. directadmin php.ini 修改,如何快速修改DirectAdmin面板默认2222端口
  2. 完整mes代码(含客户端和server端_200行代码实现基于paxos的kv存储
  3. DNS 流程说明以及相关问题的解析
  4. Price merge是通过org change的callback来trigger的
  5. Ansible 详解2-Playbook使用
  6. java ltp4j_43、哈工大NLP自然语言处理,LTP4j的测试+还是测试
  7. 二叉树期权定价python代码_欧式和美式期权的二叉树和Greek(1)——PYTHON
  8. 碳钢腐蚀速率计算公式_化工管道用金属材料的腐蚀
  9. Golang map的底层实现
  10. django 笔记3
  11. 牛人也得看的CSS常识
  12. 【JAVA】-- 坦克大战全部代码
  13. 3. 项目立项三板斧-建议书-可行性研究-评估论证
  14. Python-15 函数:我的地盘听我的
  15. 第二篇:mig IP的创建
  16. Shape 文件格式解释
  17. matlab画红色爱心(心形图)
  18. linux 运维工程师的前景怎么样?
  19. QGC地面站使用教程
  20. NMEA GPRMC 格式图解,NMEA 工具的比较

热门文章

  1. 使用 C# 开发的摸鱼背单词软件 ToastFish
  2. Spring注解驱动开发(四)
  3. 关于网易门户网站框架结构的思考
  4. MySQL-存储过程与函数
  5. c语言峰值算法_C语言寻找一组数据中的第一第二峰值
  6. 内存管理:物理地址、虚拟地址、逻辑地址
  7. 几款LINUX下的CHM查看器
  8. Python之 MYSQL基本设置及 查询
  9. Minecraft 开服:从入门到精通
  10. HTML中给图片添加网站超链接