比如9個數中取4個數的組合以及列出各種組合,該如何做?
固定:1 2 3 ,組合有1234 1235 1236
固定1 2 4,組合有:1245 1246
def程式的輸出結果,正如之前分析的那樣。combnumberloop4(m, b):
totalnumber =0
for i in range(1, m+2-4):
b[0] =i
for j in range(i+1, m+2-3):
b[1] =j
for k in range(j+1, m+2-2):
b[2] =k
for l in range(k+1, m+2-1):
b[3] =l
b totalnumber += 1
return
totalnumber
group=[99,99,99,99]
"\nusing loop: %d\n
" % combnumberloop4(6, group)
我們再回到c(6,4)問題,除了上面列出的十個步驟,我們換個思路:
如果在6個數中選定乙個數,那麼確定剩下的3個數是不是變為了「從5個數中選3個數的組合問題」了呢?以此類推,這似乎變成了乙個「遞迴」問題了,確實,我們可以用遞迴的思路來解決這個問題。
對於c(m, n)列出所有組合的問題,可以按照一下的步驟來進行程式設計,這次我們按從後往前的順序來列出所有組合:
注意,設計遞迴函式一定要有終止條件,否則會造成「死迴圈」。
實現的**如下:
def遞迴的使用,讓程式寫起來非常的簡潔,但是,在寫程式的時候,我有兩個地方(其實程式也就難在這兩個地方),折騰了好幾天才弄清楚:combnumber(m, n, b):
global
totalnumberr
for i in range(m, n-1, -1):
b[n-1] =i
if n-1>0:
combnumber(i-1,n-1,b)
else
:
b totalnumberr += 1
return
totalnumberr
group=[99,99,99,99,99]
totalnumberr =0
"\nusing recursive: %d\n
" % combnumber(7,5,group)
FFT解決組合數問題
有k種元素,均有無窮多個,規定第i種元素選取的個數ci必須屬於乙個特定的集合si,當需要選取r個元素時,有多少種選取方式?exp 有蘋果,香蕉和桃子3種水果,如果蘋果只能選不超過3個,選香蕉的個數必須是5的倍數,而桃子的個數必須是素數,問選r個水果有幾種方法。solution 解決方法是把每個集合寫...
非遞迴解決組合問題
從m 個互不相同元素中取 n 個元素,一般選用遞迴或回溯演算法解決,本文旨在利用進製轉換的方法達到這一目的。如下 sub getall byval num as integer,byref x as variant,byref result as string,optional byref all ...
用DFS解決組合問題
一直以來,大量做各類管理系統的程式設計師,大量的時間都在處理各類增刪改查問題,對於其他的方面尤其是演算法層面的涉及較少,這次就遇到乙個問題。使用者上傳乙份excel,讓使用者選擇其中的部分列頭,程式對列頭做兩兩組合,並對所有的組合取excel表中的資料,繪製乙個折線圖。檔案上傳。前端使用非同步外掛程...