【发布时间】:2016-05-07 05:00:30
【问题描述】:
我正在尝试生成 n 个数字的所有可能组合。例如,如果 n = 3,我想要以下组合:
(0,0,0), (0,0,1), (0,0,2)... (0,0,9), (0,1,0)... (9,9,9).
post 描述了如何在 n = 3 时这样做:
[(a,b,c) | m <- [0..9], a <- [0..m], b <- [0..m], c <- [0..m] ]
或者为了避免重复(即同一个 n-uple 的多个副本):
let l = 9; in [(a,b,c) | m <- [0..3*l],
a <- [0..l], b <- [0..l], c <- [0..l],
a + b + c == m ]
但是,对于n > 3,遵循相同的模式很快就会变得非常愚蠢。假设我想找到所有的组合:(a, b, c, d, e, f, g, h, i, j) 等。
任何人都可以在这里指出正确的方向吗?理想情况下,我宁愿不使用内置函数,因为我正在尝试学习 Haskell,我宁愿花时间理解一段代码,而不仅仅是使用别人编写的包。不需要元组,列表也可以。
【问题讨论】:
-
只写一个递归函数。给定
n-1选项的组合,生成n选项的组合。你会想要输出一个列表,而不是一个固定长度的元组。 -
如果在你解决了这个问题之后你仍然想利用库函数,请知道
replicateM n [1..100]可以完成这项工作。不过,了解原因并非易事——所以等你更熟悉 Haskell 之后再做吧。 -
sequence $ replicate 3 [0..9]会将叉积生成为列表,不是元组但易于泛化 -
生成所有数字组合...例如3 位数字是
000、001、002...009、010、011...999...我错过了什么,或者不是这个计数的数学概念? -
为什么没有人提到这个问题与组合完全无关。
标签: haskell functional-programming tuples cartesian-product