Python 组合数学:显示所有排列

Python 组合数学:显示所有排列,python,Python,我试图找到一种方法,以编程方式显示n个蓝色硬币和m个红色硬币的所有排列。我知道答案是n+MCN,但我想让电脑显示所有的n+MCN排列。只是澄清一下,如果n和m都是2,那么计算机应该给出的输出是:[bbrr,brbr,brrb,rbbr,rbrb,rrbb]。此外,如果可能的话,代码应该使用Python。如果您没有Python,它仍然可以工作,因为我知道许多语言。我尝试过使用itertools,但它不起作用,因为每个红色硬币都被视为不同的。我已经尝试了很多关于Python中可区分性的研究,但没有发

我试图找到一种方法,以编程方式显示n个蓝色硬币和m个红色硬币的所有排列。我知道答案是n+MCN,但我想让电脑显示所有的n+MCN排列。只是澄清一下,如果n和m都是2,那么计算机应该给出的输出是:[bbrr,brbr,brrb,rbbr,rbrb,rrbb]。此外,如果可能的话,代码应该使用Python。如果您没有Python,它仍然可以工作,因为我知道许多语言。我尝试过使用itertools,但它不起作用,因为每个红色硬币都被视为不同的。我已经尝试了很多关于Python中可区分性的研究,但没有发现任何东西。非常感谢您的帮助。

让我们为此创建一个递归函数

f0,0,currentStr=currentStr

fn,m,currentStr=fn-1,m,currentStr+b和fn,m-1,currentStr+r

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')]

这是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"]

我投票将这个问题作为离题题来结束,因为除了缺乏任何基础研究或尝试之外,如果您花几分钟的时间来查找python标准库,也可以在python标准库中找到这个问题。请发布您迄今为止的尝试。这是一个合理的问题。标准库选项itertools.combinations在这里没有帮助,因为输入有重复的值,库函数假定不同的输入。m和n为负值,这永远不会终止。你需要考虑两个基本情况,分别是n=0和m=0。