生成三元组中所有可能的数字组合?

时间:2014-11-28 00:01:58

标签: haskell list-comprehension ghci

比如说我想构建一个三元组,从三元组中获取1..100的每个数字组合;即:

[(0,0,0),(0,0,1),(0,1,1),(1,1,1),(0,0,2),(0,1,2),(0,2,2),(1,2,2)]

..等等,直到给定的界限(即:100:给我们最终的三联体(100,100,100));在haskell中是否有任何合理的方法可以做到这一点,或者我最好写一个方法,简而言之就是持有一个边界指针,并递归地增加每个数字,直到它等于右边的数字?

2 个答案:

答案 0 :(得分:5)

我认为您的描述最符合列表理解,以表达您想要做的事情:

[(a, b, c) | c <- [0..100],
             b <- [0..c],
             a <- [0..b] ]

答案 1 :(得分:1)

你说你想要数字1..100,但在例子中提到0。此外,您说“每个组合”但不提及(1,0,0)

[(a,b,c) | m<-[0..100], a<-[0..m], b<-[0..m], c<-[0..m] ]

为了避免重复,按照总和的顺序列举它们:

let l = 100; in [(a,b,c) | m<-[0..3*l],
                           a<-[0..l], b<-[0..l], c<-[0..l],
                           a+b+c == m ]

通过缩小可能的范围,可以加速计算(保持相同的结果):

let l = 100; in [(a,b,m-a-b) | m<-[0..3*l],
                               a<-[(max 0 (m-2*l))..(min l m)],
                               b<-[(max 0 (m-a-l))..(min l (m-a))] ]