全排列就是,给定一个序列,列举出该序列中元素所有的排列情况,列举方法有递归和非递归两种,详细可以见这位大神写的博客:https://blog.csdn.net/jopus/article/details/18998403。我只列出来两个重要的图吧。

1.非递归:字典序法 ,如下图[1,2,3]的例子

2.递归方法

递归方法就是将序列中第一位固定,然后将后面n-1为的全排列列举出来,取遍第一位所有取值,递归地得到所有排列。

python实现如下:

# -*- coding:utf-8 -*-
# _author_ = xu_qn
# 全排列 分为两种:递归与非递归# 递归方法
def recursion_permutation(list, first, last):if first >= last:  # 递归结束情况print(list)for i in range(first, last):  # first包含,last不包含list[i], list[first] = list[first], list[i]recursion_permutation(list, first+1, last)list[i], list[first] = list[first], list[i]  # 交换回来,还原成原来的序列放置重复交换# 非递归:字典序法
def is_not_reverse(list):  # 判断是否为倒叙listfor i in range(len(list)-1):if list[i] < list[i+1]:return Truereturn Falsedef find_first_min(list):  # 从右到左是递增的 只需要找到最右大于pi的数for i in range(len(list)-1, 0, -1):if list[i] > list[0]:min_index = ibreakreturn min_index
def reverse_list(list,first,last):while first < last:if list[first] > list[last]:list[first], list[last] = list[last], list[first]first += 1last -= 1def dictionary_permutation(list):while is_not_reverse(list):for i in range(len(list) - 2, -1, -1):if list[i] < list[i + 1]:  # 从左到右找到第一个左边小于右边的数pi 坐标ij = find_first_min(list[i:])  # 找到pi右边数字中比pi大的最小数下标list[i], list[j+i] = list[j+i], list[i]  # 交换pi,pj,pj在原list的坐标i+jreverse_list(list, i+1, len(list)-1)  # 将pi后的list倒转,变为升序print(list)if __name__ == "__main__":list = [1, 2, 3, 4, 5]#recursion_permutation(list, 0, len(list))dictionary_permutation(list)

全排列递归与非递归python实现相关推荐

  1. 全排列(含递归和非递归的解法)

    全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...

  2. 全排列(递归与非递归实现)

    全排列问题在公司笔试的时候非经常见,这里介绍其递归与非递归实现. 递归算法 1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a ...

  3. 拉马努金的整数拆分全排列JAVA实现非递归

    拉马努金的整数拆分全排列JAVA实现非递归 点这里: 递归方式 结果是:组合成100的可能性共有:190569292种!! 不做详细说明了,需要看文字描述的,点上面链接跳转递归方式,查看详细说明 来, ...

  4. python快速排序递归与非递归

    快速排序递归与非递归python 写在前面 快速排序的递归函数 快排的切分函数 快排的非递归函数 完整的源代码 写在前面 众所周知,快速排序相对于选择排序,插入排序,冒泡排序等初级排序有着天然的优势. ...

  5. python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  6. 归并排序的python实现:递归与非递归

    递归 原理比较简单,就是有序数组的合并. def merge(a, b):c = []i = j = 0while i < len(a) and j < len(b):if a[i] &l ...

  7. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  8. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

  9. C#实现(递归和非递归)快速排序和简单排序

    C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...

最新文章

  1. python自动测试p-python自动化测试_8
  2. 当你看完这篇朴素贝叶斯(NB)算法后,是否会有怦然心动的感觉
  3. vue中mixins的使用方法和注意地方
  4. Reason: image not found
  5. 一个有用的区别IE不同浏览器CSS的标签
  6. 2016计算机二级公共知识,2016计算机二级《公共基础知识》章节训练与答案
  7. c语言数组中循坏移动问题,如何将一个数组的元素循环左移?
  8. 开机出现grub rescue
  9. header元素 footer元素 hgroup元素
  10. async/await 异步编程(转载)
  11. 云音乐计算机等科目英文,音乐英文术语
  12. 程序员的真实生存现状
  13. 单细胞及空间转录组设计分析与机器学习在生物医学应用
  14. Linux音频系统编程之芯片平台适配功放Codec Driver解读
  15. 2021年“全球乳业20强”榜单发布;全新版希尔顿花园酒店计划2025前在中国开业超200家 | 美通社头条...
  16. 《微信公众平台与小程序开发——从零搭建整套系统》——第1章,第1.2节微信公众平台...
  17. 滴滴进军实物电商后,阿里发力网约车
  18. preg_match_all 结果排序之PREG_SET_ORDER参数
  19. C# 简洁代码实现面向切面编程(AOP)
  20. 2022年十大除甲醛净化器排名

热门文章

  1. 启动rabbitmq,遇到发生系统错误2和发生系统错误5的解决方法
  2. HTML外边框塌陷什么意思,html如何解决高度塌陷问题
  3. 数字油田AI平台建设之视野、策略及切入点(深度好文)
  4. F: Pond Skater(BFS)
  5. C++ lambda递归
  6. 揭秘软件开发中的达摩克利斯之剑
  7. 【论文解读】Mining Dual Emotion for Fake News Detection
  8. 按键精灵什么是动态数组?如何使用动态数组?(新手进阶)
  9. 基于STM32F103单片机的智能药盒喂食器智能插座系统
  10. 软件开发人员的作战手册 - 让程序员活的久一点