这是Haskell任务: 您有一个元素列表和一个数字。 您必须从列表中找到三元组Just(a,b,c),其中元素a,b和c的总和等于给定的数字。 例子
fun [] 3 -> Nothing
fun [1,2,3,4,5,6] 7 -> Just (1,2,4)
我试图做这样的事(一开始可能没有)。但是创建分组时有一个错误
createGroups :: [Int] -> [(Int, Int, Int)]
createGroups [] = []
createGroups (x:y:xs) = map ((,,) x y) xs ++ createGroups xs
sum' :: (Int, Int, Int) -> Int
sum' (a,b,c) = a + b + c
filtGr :: [(Int, Int, Int)] -> Int -> (Int, Int, Int)
filtGr [] _ = (0,0,0)
filtGr (x:xs) a = if sum' x == a then x else filtGr xs a
答案 0 :(得分:2)
我建议您从编写代码开始,以生成所有可能的三元组。您的createGroups
尝试执行此操作,但这是不正确的,因为应用于[1,2,3,...]
时将永远不会生成(1,3,something)
,因为1
和2
被一起使用或丢弃了。
我建议改用列表推导,利用tails
:
createGroups list =
[ (x,y,z)
| (x:xs) <- tails list
, (y:ys) <- tails xs
, z <- ys ]
(如果您不想使用tails
,则需要一个更聪明的递归函数,而不是上面的列表理解。)
然后您可以过滤出不等于所需目标数字的三元组。
答案 1 :(得分:0)
我有这样的序列
subsWithSum :: Int-> [Int]-> [[Int]]
subsWithSum n list =过滤器(\ x-> sum x == n)(过滤器(\ x->长度x == 3)(子序列列表))