2017-03-08 59 views
-4

我試圖找到一種方式來以編程方式顯示n個藍色硬幣和m個紅色硬幣的所有安排。我知道答案是n + m C n,但我想讓計算機向我展示所有n + m C n的安排。只是爲了澄清,如果n和m都是2,計算機應該給出的輸出是:["bbrr", "brbr", "brrb", "rbbr", "rbrb", "rrbb"]。另外,如果可能的話,代碼應該在Python中。如果你沒有Python,它會繼續工作,因爲我知道很多語言。我嘗試過使用itertools,但它不起作用,因爲每個紅色硬幣都算作不同。我已經嘗試了很多關於Python區分能力的研究,但沒有發現任何東西。幫助將不勝感激。組合:顯示所有安排

+2

我投票結束這個問題作爲題外話,因爲除了這個缺乏任何基礎研究或嘗試,這也是可以在Python標準庫中找到的東西,如果你試圖尋找它的一兩分鐘。 –

+1

請發表您迄今爲止嘗試過的內容。 – James

+1

這是一個合理的問題。標準庫選項* itertools.combinations *在這裏沒有幫助,因爲輸入具有重複值,並且庫函數採用不同的輸入。 –

回答

1

itertools包中有你所要求的。但是,它會考慮相同的項目是獨立的實體,所以我們可以用set()清理重複

from itertools import permutations 

sorted(set(x for x in permutations('rrbb', 4))) 

[('b', 'b', 'r', 'r'), 
('b', 'r', 'b', 'r'), 
('b', 'r', 'r', 'b'), 
('r', 'b', 'b', 'r'), 
('r', 'b', 'r', 'b'), 
('r', 'r', 'b', 'b')] 
-1

允許創建一個遞歸函數用於此目的,

F(0,0,currentStr)= currentStr

F(N,M,currentStr)= F(N-1,M,currentStr + 「b」)和f(n,m-1,currentStr +「r」)

+0

m和n變負,這永遠不會終止。您需要考慮兩個基本情況,分別是n = 0和m = 0。 –

1

下面是Haskell中一個基本的遞歸解決方案。

arrangements :: (Integral n, Integral m) => n -> m -> [String] 
arrangements n 0 = [stimes n "b"] 
arrangements 0 m = [stimes m "r"] 
arrangements n m = (('b' :) <$> arrangements (n - 1) m) 
       <> (('r' :) <$> arrangements n (m - 1)) 

λ> arrangements 2 2 
["bbrr","brbr","brrb","rbbr","rbrb","rrbb"] 

λ> arrangements 2 3 
["bbrrr","brbrr","brrbr","brrrb","rbbrr","rbrbr","rbrrb","rrbbr","rrbrb","rrrbb"]