我试图找到一种方式来以编程方式显示n个蓝色硬币和m个红色硬币的所有安排。我知道答案是n + m C n,但我想让计算机向我展示所有n + m C n的安排。只是为了澄清,如果n和m都是2,计算机应该给出的输出是:["bbrr", "brbr", "brrb", "rbbr", "rbrb", "rrbb"]
。另外,如果可能的话,代码应该在Python中。如果你没有Python,它会继续工作,因为我知道很多语言。我尝试过使用itertools,但它不起作用,因为每个红色硬币都算作不同。我已经尝试了很多关于Python区分能力的研究,但没有发现任何东西。帮助将不胜感激。组合:显示所有安排
-4
A
回答
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"]
相关问题
- 1. 如何显示所有组合?
- 2. MySQL - 显示所有排列?
- 3. 排序所有可能的组合
- 4. 排名所有可能GROUPBY组合
- 5. GroupBy所有可能的排列组合
- 6. 显示所有分组结果和排序
- 7. 显示集合中的所有变体
- 8. 显示所有可移动设备的组合框
- 9. 显示列表中所有数字组合的算法
- 10. 如何显示4幅图像的所有可能组合?
- 11. 如何显示组的所有成员?
- 12. 并非所有显示的组件
- 13. JPanel不显示所有定制组件
- 14. 二维数组的所有可能的排列组合
- 15. 按SQL Server分组(显示所选组中的所有元素)
- 16. PHP数组显示不显示所有列
- 17. Excel可以聚合/组合x个数据点并显示平均值而不是显示所有数据点?
- 18. 如何显示Django中所有用户的每日日程安排?
- 19. 组合框显示部件
- 20. extjs组合显示值
- 21. 显示AudioCaptureDevices的组合框
- 22. 组合框SelectedItem显示
- 23. 检索MySQL数据在多个组合框排列显示
- 24. 排序显示的结果而不合并两个数组
- 25. 测试所有组合(C++)
- 26. 获取所有组合
- 27. 所有可能的组合
- 28. 生成所有组合
- 29. 所有组合 - LINQ查询
- 30. 查找所有组合
我投票结束这个问题作为题外话,因为除了这个缺乏任何基础研究或尝试,这也是可以在Python标准库中找到的东西,如果你试图寻找它的一两分钟。 –
请发表您迄今为止尝试过的内容。 – James
这是一个合理的问题。标准库选项* itertools.combinations *在这里没有帮助,因为输入具有重复值,并且库函数采用不同的输入。 –