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.索引数组选择的全排列:代码展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值