2017-03-08 57 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"]