#!/usr/bin/python#-*- coding:GBK -*-defpermutation(arr,n=None,duplicate=False):"""arr : 如果是数字,则返回全排列数;如果是数组,则返回全排列集合
n : 元素个数,默认全排列
duplicate: 同一个元素是否可以放在多个位置,默认不允许
注释:如果允许元素重复,n 个位置,每个位置 size 种选法,排列数 size ** n"""#需要排列的数目,默认全排列if(n==None):if(type(arr)isint):n=arrelse:n=len(arr)#元素数目if(type(arr)isint):size=arrelse:size=len(arr)if(n<1):raiseException,'Error: n size):raiseException,'Error: n > len(arr)'#第一个元素是数字,则返回全排列数目if(type(arr)isint):if(duplicate):returnsize**nelse:
result=size
temp=size-1while((size-temp)
result=result*temp
temp=temp-1returnresult#循环计数器,一层一个,共 n 个,都初始化为 0repeat_count=[0foriinrange(0,n)]#当前正在循环的层layer=0#随着计数器和层数不停变化的临时组合,N 维数组v_temp=[Noneforiinrange(0,n)]
result=[]#当前在第 0 层,且第 0 层计数器达到末尾时退出循环while(repeat_count[0]0):if(layer
repeat_count[layer]=repeat_count[layer]+1layer=layer+1else:#否则,层计数器归零,向上一层v_temp[layer]=None
repeat_count[layer]=0
layer=layer-1else:#第 n-1 层:计数器每移动一个位置,都是一种组合pos=repeat_count[layer]if(pos
layer=layer-1returnresultif__name__=="__main__":printpermutation(10),'\n'#全排列数printpermutation(10,2),'\n'#5 选 2 排列数printpermutation(10,duplicate=True),'\n'#允许重复的全排列li=['a','b','c']print'全排列:',permutation(li),'\n'print'选2 :',permutation(li,2),'\n'print'允许重复 :',permutation(li,duplicate=True),'\n'raw_input()