比如说我想构建一个三元组,从三元组中获取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中是否有任何合理的方法可以做到这一点,或者我最好写一个方法,简而言之就是持有一个边界指针,并递归地增加每个数字,直到它等于右边的数字?
答案 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))] ]