全排列问题

1、定义

从n个数中选取m(m<=n)个数按照一定的顺序排成一个序列,叫做n个元素的子排列。由排列的定义可见,不同的顺序显然是一个不同的排列。从n个元素中选取n个元素的一个排列,称为一个全排列。全排列的排列数为n!个。

2、算法思想

这个问题很适合用递归解决(当然也可以用非递归实现),使用递归关键是要找到问题中的基线条件(base case)和递归条件(recyrsive case)。递归条件指的是函数调用自己,而基线条件泽指的是函数不再调用自己,从而避免无限循环。那么如何来找这两个条件呢?
从我们自己手写一个序列[1,2,3,4]的全排列着手,想的是先写好开头是1的全排列,然后是开头分别为2,3,4的全排列。在开头为1的全排列中,我们又可以按照以上思路写出序列[2,3,4]的全排列。从编程的角度来说,当我们写完开头为1的全排列后,将1与2交换位置即可再次排序,一直到和4交换排序完为止。随着不断的深入,我们需要知道每一轮排序需要交换几次,于是指定一个变量n记录进入的层次。
于是,基线条件就是已经待排列的自序列只剩一个,即深入到最后一层,也就是n == size - 1(序列下表从0开始,所以减去1)。递归条件就是n < size -1 。

3、代码实现

def swap(a1,a2):
    return a2,a1

def permutate(array,size,n):
    '''
     array: 输入序列
     size : 序列长度
     n : 目前进入到第几层
    '''
    if  n == size-1:
        print array
    else:
        for i in range(n,size): #每深入一层,待排序的自序列就少一个,需要交换的循环次数就少一次
            array[n],array[i] = swap(array[n],array[i])
            permutate(array,size,n+1)
            array[n],array[i] = swap(array[n],array[i])

if  __name__ == '__main__':
    a = [1,2,3,4]
    permutate(a,len(a),0)

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值