列表元素的全部排列html
case:有亂序、不定長列表如[1,3,5,2],打印全部列表元素全部排列狀況,並計數app
思路:重複的步驟--》長度爲n的排列-》長爲n-1的排列,長爲n-2的排列函數
.........spa
直到長度爲1,只有一個元素,輸入當前的排列順序code
n = [1,2,3,4] res = [] count = 0 def func1(k,start,end): global count if end == start: count += 1 print(k) # res.append(k[:]) return for i in range(start,end+1): #循環列表,從列表中選取一個元素做爲排列的首元素,將剩餘n-1的序列傳入子遞歸函數 k[start],k[i] = k[i],k[start] func1(k,start+1,end) k[start],k[i] = k[i],k[start] # 將替換後的序列重置爲原來的序列,確保後續循環中,選出的首元素是沒選擇過的元素
# 遞歸層數從上往下(由外到內)的過程當中對列表進行新的排列,
# 由內到外的過程當中將列表重置爲每層遞歸函數傳入列表的時的排序方式
func1(n,0,len(n)-1) print(count)
升級:將全部排列結果放在一個大列表中htm
n = [1,2,3,4] res = [] count = 0 def func1(k,start,end): global count if end == start: count += 1 print(k) res.append(k[:]) return for i in range(start,end+1): k[start],k[i] = k[i],k[start] func1(k,start+1,end) k[start],k[i] = k[i],k[start] func1(n,0,len(n)-1) print(count)
解釋:爲何res.append(k[:])而不是res.append(k)?對象
全部遞歸層數中操做的同一個對象(對象的不一樣引用),blog
res.append(k)之後,最終的列表中子元素列表k都指向同一個對象排序
第一句k[start],k[i] = k[i],k[start] 對列表k從新排序以後遞歸
第二句k[start],k[i] = k[i],k[start] 將列表重置爲原來的排序方式,最終結果res大列表中,全部子元素列表都指向同一個對象(新排序而後又重置爲原來排序方式的列表)
因此要用切片(淺copy)copy出值相同對象(值相等,可是是兩個列表對象)
深淺copy(對象與引用)請參照個人另外一篇文章