Получить конкретную тройку из списка - PullRequest
0 голосов
/ 16 января 2019

Вот задача на 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 

Ответы [ 2 ]

0 голосов
/ 18 января 2019

У меня есть такие последовательности
subsWithSum :: Int -> [Int] -> [[Int]] список subsWithSum n = фильтр (\ x -> сумма x == n) (фильтр (\ x -> длина x == 3) (список подпоследовательностей))

0 голосов
/ 16 января 2019

Я бы посоветовал вам начать с написания кода для генерации всех возможных троек. Ваш 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, вам нужна более умная рекурсивная функция, вместо понимания списка выше.)

Затем вы можете отфильтровать тройки, которые не суммируются с требуемым целевым числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...