天天看點

python 排列組合算法_Python 進階之遞歸(二)排列組合

大家好,我是一隻初入程式設計坑的生物狗。在學習python的過程中整理了一下自己的資料分享給大家,同是小白的朋友們可以拿來練習,提升自信(如果我這隻笨笨的生物狗都可以編代碼的話你萌也木問題的!)肯定有很多不足的地方,也麻煩大家指出好幫助我進步!

記得教授用遞歸示範排列組合時,對着code連發三聲感歎:"Beautiful!" "Amazing!" "Elegant!"

我也很激動啊,隻是當我嘗試自己寫的時候......

好啦不廢話了。自認為組合(combination)簡單點,就先從它開始吧。它的實質就是我們上一節說到的分叉的思想(選它,或者不選)

不怕大家說我傻,知道我看到code第一個困惑是什麼嗎?---為什麼沒有return????這就是分叉樹遞歸的神奇之處了,如果你在base condition那裡return,你會驚訝地發現它隻return了整個大樹的一個樹枝哦!那麼問題來了,如果我暫時不想print出這些結果怎麼辦?好辦,再加一個參數——一個空的list,把每個結果儲存起來。

來一道簡單的練習:

練習一:A,B,C,D,E和F去做志願,但是人家隻需要三個人。A隻想和B一起去(但是B不一定非得和A一起去)。C 和D是仇人見面就打架不能一起去。請列出所有可能性。

先把所有組合都得到,再用另一個function篩去不符合條件的。這種簡單直接的方法可不是在哪都适用哦,給定數組很大的話你會在recursion無底洞中體會深深的恐懼(這個我們後面還會細說)...

練習二:(模仿俄羅斯套娃)你有一屋子的紙箱子(一個list,裡面存儲着每個箱子的長寬高的值e.g.[(1,3,2),(2,5,6),(3,4,8)...]),你想把他們收拾好以盡量騰出更多的空間。于是你想把大小箱子套在一起,長寬高都較小的箱子可以放進長寬高都較大的箱子裡面。寫一段code來得到最多能把哪些箱子套到一起:

這裡就注意了,如果先不管箱子大小,把所有組合都求出來.....會報recursion error的,沒報的話...就是箱子不夠多> <是以我們要試圖在combination的function中就把條件限定出來。原代碼很長,這裡不全po出來。Hint:把裝所有箱子的list先sort一下,這樣從最小的開始,如果最小的可以放進後一個稍大的箱子,你可以選擇放或者不放,依次類推。為什麼要選擇放與不放呢?因為list是按照其中每個tuple中第一個數值(在這個問題中我們假設是箱子的長)的大小來排序的,但是長度短不代表它高度或寬度也短,是以很可能影響後面放更多的箱子!

私以為組合比排列要好了解很多,是以下一節要整理排列啦!算法中有不對或者很笨的地方也請大家多多指教!