python递归 数字全排列_递归全排列(python)

设(ri)perm(X)表示每一个全排列前加上前缀ri得到的排列.当n=1时,perm(R)=(r) 其中r是唯一的元素,这个就是出口条件.

当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),...(rn)perm(Rn)构成.

k表示前缀的位置,m是要排列的数目.

#!/usr/bin/env python

def perm(list_info,k,m):

if k == m-1:

for i in range(m):

print list_info[i],

print

else:

for i in range(k,m):

list_info[k],list_info[i]=list_info[i],list_info[k] #交换前缀,使之产生下一个前缀.

perm(list_info,k+1,m)

list_info[k],list_info[i]=list_info[i],list_info[k] #将前缀换回来,继续做上一个的前缀排列.

if __name__ == "__main__":

list_info = [1,2,3]

perm(list_info,0,3)

函数Perm(list_info,k,m)是求将list的第0~k-1个元素作为前缀、第k~m个元素进行全排列得到的全排列,如果k为0,且m为n,就可以求得一个数组中所有元素的全排列。其想法是将第k个元素与后面的每个元素进行交换,求出其全排列。这种算法比较节省空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值