组合数学:显示所有排列

2024-04-19 19:05:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一种方式来显示所有的安排,n蓝色硬币和m红色硬币编程。我知道答案是n+mcn,但我想让电脑显示所有n+mcn的排列。澄清一下,如果n和m都是2,计算机应该给出的输出是:["bbrr", "brbr", "brrb", "rbbr", "rbrb", "rrbb"]。另外,如果可能的话,代码应该是Python的。如果你没有Python,它仍然可以工作,因为我懂很多语言。我试过使用itertools,但它不起作用,因为每一个红色硬币被视为不同的。我尝试了很多关于Python的可分辨性的研究,但什么也没有发现。我们将不胜感激。你知道吗


Tags: 答案编程计算机方式硬币蓝色电脑红色
3条回答

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

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

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

f(0,0,currentStr)=当前str

f(n,m,currentStr)=f(n-1,m,currentStr+“b”)和f(n,m-1,currentStr+“r”)

相关问题 更多 >