python 全排列 递归中的两种实现

Posted 雷八天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 全排列 递归中的两种实现相关的知识,希望对你有一定的参考价值。

我所知道的全排列有四种:

1.迭代的排列组合全排列(非递归):字典序的大小,即传说中的A33

2.邻位置对换的全排列(非递归):

方法一:生成下一个排列,该方法对重复元素同样有效

如果可以根据一个排列生成他的下一个排列,那么生成所有排列也就不在话下了,下面以排列625431为例来说明怎么生成下一个排列,首先从右向左找到第一个降序对,这里是25,然后将前面的数字与其后面的大于它的最小数字相替换,这里是指将2与2后面的大于2的最小数字相替换,被替换数字是3,替换后的序列是635421,此时3后面的数字肯定是一个降序(从左到右)序列,将这个序列颠倒即可,得到631245,这就是625431的下一个序列,初始时应将元素排序,然后逐个生成;

方法二:生成第n个排列

m个元素的排列总数为m!; 假设m个元素初始时已经升序放入集合key中,则第n个排列的第一个元素必然是集合key中第n/(m-1)! 小元素,记为kx, 设定最小元素为第0小元素;接下来在集合key-kx中找出第n%(m-1)!个排列;以此类推,迭代找出所求排列的所有元素;

如果有重复元素,则m个元素的排列总数为m1! /(c1! * c2! *….cn!),ci为元素ki的重复次数;集合key也是一个多重集,对重复元素每次也只删除一个;

3.交换位置的递归全排列:代码展示

#all permutation


def printInfo():
    print("test info")


def swap(array, end, start):
    temp = array[end]
    array[end] = array[start]
    array[start] = temp

def isSwap(array, end, start):
    for i in range(start, end):
        if(array[i] == array[end]):
            return False
    return True

def all_Permutation(array, n):
    if n == len(array):
        print(array)
        return
    for i in range(n, len(array)):
        if not isSwap(array,i, n):
            return
        swap(array,i,n)
        all_Permutation(array, n+1)
        swap(array, i, n)

if __name__ == '__main__':
    array = ['a','c','c']
    all_Permutation(array, 0)


4.索引数组选择的全排列:代码展示

以上是关于python 全排列 递归中的两种实现的主要内容,如果未能解决你的问题,请参考以下文章

java中,如何实现集合的升序和降序排列

全排列 递归实现

javascript实现表格升序降序排列

如何实现JSP列表升序或者降序

奇数结点升序偶数结点降序的单链表排序(Python实现)

Java中对数组升序排列用Arrays.sort( )方法,那降序排列用啥方法?