實現排列組合

2021-10-04 12:27:18 字數 1982 閱讀 7690

排列組合是組合數學的基礎,從n個不同元素中任務m個,約定1從n個不同元素中任取m個(約定1計算a(n,m)與c(n,m)只要簡單進行乘運算即可,要具體展現出排列的每一列與組合的每一組,絕非輕而易舉。我們應用遞迴設計來具體實現排列與組合。

def p(n,m,k,a):

global s

if(k<=m):

for i in range(1,n+1):

a[k] = i #第k個數賦值i

u = 0

for j in range(1,k):

if(a[k]==a[j]):

u = 1 #乙個標記位 看看是否選了重複的數字

if(u==0):

if(k==m): #如果選擇的數的個數已經到了m個,則列印出來

s+=1

for j in range(1,m+1):

print(a[j],end=" ")

print()

else:

p(n,m,k+1,a) #如果選擇的數的個數還沒到m個,則探索下乙個數

return s

if __name__=='__main__':

n = int(input())

m = int(input())

s = 0

a = [0 for i in range(m+1)]

result = p(n,m,1,a)

print("排列的總數為",result)

以上遞迴設計的要點:

遞迴函式p(k)的變數從1開始取值,首先乙個位置乙個位置來選取數字,當k<=m,第k個數,a[k]取i(1<=i<=n),u=0;

如果a[k]與前面已取的數a[j](j若k=m,即已取了m個數,輸出這m個數即為乙個排列,a[k]繼續從i+1開始,在餘下的數中取乙個數。直到全部取完,則返回上一次呼叫p(k)處,即回溯到p(k-1),第k-1個數繼續往下取值;

即還未取m個數,即在p(k)狀態下呼叫p(k+1)繼續探索下乙個數,下乙個數a[k+1]又從(1——n)中取數。

若標誌量u=1,第k個數取i不成功,則接著從i+1開始中取下乙個數。若在1——n中的每乙個數都取了,仍是u=1,則返回上一次呼叫p(k)處,即回溯到p(k-1),第k-1個數繼續往下取值。

注意到組合與組成元素的順序無關,約定組合中的組成元素按遞增排序。所以其實組合的**和排列的**基本相同,只是我們的判斷條件需要修改一下,將a[k]==a[j]改為a[k]>=a[j]。

def p(n,m,k,a):

global s

if(k<=m):

for i in range(1,n+1):

a[k] = i #第k個數賦值i

u = 0

for j in range(1,k):

if(a[k]>=a[j]):

u = 1 #乙個標記位 看看是否選了重複的數字

if(u==0):

if(k==m): #如果選擇的數的個數已經到了m個,則列印出來

s+=1

for j in range(1,m+1):

print(a[j],end=" ")

print()

else:

p(n,m,k+1,a) #如果選擇的數的個數還沒到m個,則探索下乙個數

return s

if __name__=='__main__':

n = int(input())

m = int(input())

s = 0

a = [0 for i in range(m+1)]

result = p(n,m,1,a)

print("排列的總數為",result)

以上就是排列組合基礎版的實現,在實際上程式設計中,關於這一類題有很多更複雜的版本,相應的**也就是在基礎版**的修改。

排列組合實現

演算法 與網際網路 組合演算法 本程式的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標 代表的數被選中,為0則沒選中。首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。然後從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同時將其左邊的...

排列組合實現

思想 排列 首先從 n 個中取乙個數,再在剩餘的一次次取乙個數,每取乙個數就把這位標記為取過了,以免下次再取。取夠k個數之後,把k個數輸出,展示結果 所以需要提前有乙個陣列來存放結果 然後再取尋找別的第k個數,依次在不斷尋找別的第 k 1 k 2 個數。取完乙個數把標記位設為未取過。void pai...

遞迴實現排列組合

置換 給定n大於等於1個元素的集合,列印這個集合所有可能的置換。我們通過觀察集合,得到生成所有置換的簡單演算法,以下是演算法的構造過程 1 a跟在 b,c,d 的所有置換之後。2 b跟在 a,c,d 的所有置換之後。3 c跟在 a,b,d 的所有置換之後。4 d跟在 a,b,c 的所有置換之後。in...