【Python】演算法之求組合

風塵_NULL發表於2020-02-23

原題:

假設有a,b,c,1,2五個字元,請用任意一門語言求出這五個數的所有組合

思考:

1)這題字元有點多,我來變換一下,a、b、c三個字元,請用任意一門語言求這三個字元的組合(數學歸納法不是從最少識別規律開始麼?)

2)嗯,三個字元,肯定是三重迴圈,最關鍵的是最記憶體迴圈記住外層迴圈是什麼,那麼自然而然寫成如下:

#!/usr/bin/python
tmp_str=''
a=['a','b','c']
for t_level0 in  range(0,len(a)) :
    for t_level1 in range(0,len(a)):
        for t_level2 in range(0,len(a)):
            tmp_str=a[t_level0] + a[t_level1] + a[t_level2]
            print(tmp_str)

執行一下,完美(三位組合,27種),如圖:


3)嗯?如果是五個字元排列,或者N個字元的組合呢?我難道要要在我的程式碼裡寫5個迴圈,或者是N個迴圈嗎?看來重要的是我要根據字元數來控制迴圈的層數,那麼怎麼控制呢,當然要用函式(函式中寫一個迴圈,接受N作為迴圈的控制,如果N遞減沒到1,繼續呼叫函式),咦?這不是遞迴嗎?哈哈,還真是,於是程式碼寫成了下面這樣:

#!/usr/bin/python
#-*- coding=UTF-8 -*-
#tmp_str=''
a=['a','b','c']
'''
#用位置記錄外層迴圈的值
for t_level0 in  range(0,len(a)) :
    for t_level1 in range(0,len(a)):
        for t_level2 in range(0,len(a)):
            tmp_str=a[t_level0] + a[t_level1] + a[t_level2]
            print(tmp_str)
'''
#prev_str 記錄外層迴圈的值
def compose(c_list,level,prev_str) :
    if level == 1:
        for value in c_list :
            tmp_str=prev_str + value
            print(tmp_str)
    else :
        level -= 1
        for value in c_list:
            tmp_str=prev_str+value
            compose(c_list,level,tmp_str)
compose(a,len(a),'')

執行結果,嗯,這才完美:

總結:

寫程式碼,從簡到繁,利用歸納法思維,往往能更快找到解決方法

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30221425/viewspace-2676810/,如需轉載,請註明出處,否則將追究法律責任。

相關文章