设(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],
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个元素与后面的每个元素进行交换,求出其全排列。这种算法比较节省空间。