實現排列組合

排列組合是組合數學的基礎,從n個不同元素中任務m個,約定1<m<=n,按任意一種次序排成一列,稱爲排列,其排列種數記爲A(n,m)。

從n個不同元素中任取m個(約定1<m<n)成一組,稱爲一個組合,其組合種數記爲C(n,m)。

計算A(n,m)與C(n,m)只要簡單進行乘運算即可,要具體展現出排列的每一列與組合的每一組,絕非輕而易舉。我們應用遞歸設計來具體實現排列與組合。

實現排列A(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)作比較,出現a[k]=a[j],即第k個數取i不成功,標誌量u=1,否則第k個數取i成功,標誌量u=0;

若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個數繼續往下取值。

實現組合C(n,m)

注意到組合與組成元素的順序無關,約定組合中的組成元素按遞增排序。所以其實組合的代碼和排列的代碼基本相同,只是我們的判斷條件需要修改一下,將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)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章