Haskell技术问题:如何实现找出和为n的无重复整数元组?
解决Haskell tuplesum函数的重复元组问题
嘿,我懂你的困扰——你的列表推导式会遍历原列表里的每一对元素,原列表中重复的5会被反复组合,自然就输出了多个一模一样的(5,5)。咱们可以通过简单调整来搞定这个问题:
方法1:先对输入列表去重
最直接的思路是先把输入列表里的重复元素清理掉,让相同元素只被处理一次。我们可以用Data.List模块里的nub函数实现这一点:
import Data.List (nub) tuplesum :: (Eq b, Num b, Ord b) => [b] -> b -> [(b, b)] tuplesum xs n = [(x1, x2) | x1 <- uniqueXs, x2 <- uniqueXs, x1 + x2 == n, x1 <= x2] where uniqueXs = nub xs
测试效果
当你输入tuplesum [5,1,4,0,5,6,9] 10时,输出会变成:
[(1,9),(4,6),(5,5)]
完美消除了重复的元组!
为什么这个方法管用?
nub会遍历列表并保留每个元素的第一次出现,后续重复的元素都会被丢弃。原列表里的多个5被压缩成一个后,列表推导式只会生成一次(5,5),而不是四次。
额外说明
如果你的场景需要保留原列表元素的出现次数,但只是不想重复输出相同元组(比如哪怕有多个5,也只显示一次(5,5)),这个方案依然适用。要是有更复杂的需求(比如统计符合条件的元组实际出现次数),咱们可以再调整逻辑,但当前方案完全匹配你描述的需求。
内容的提问来源于stack exchange,提问作者derpnallday
相关产品推荐
相关产品推荐

