Haskell:给定一个数字列表和一个数字k,返回列表中的任何两个数字是否合计为k

时间:2018-10-23 23:51:35

标签: haskell

给出一个数字列表和一个数字k,返回列表中的任何两个数字是否加起来为k。

例如,给定[10,15,3,7]且k为17,则由于10 + 7为17,因此返回true。

程序必须提示用户输入。

程序必须接受列表作为逗号分隔值的集合。

所有值均应为整数。

输入列表的长度可以在1到42之间。

我做了什么

我已经能够输入整数列表作为列表,并用逗号分隔,但是当2个数字加到k时我无法返回true

toList :: String -> [Integer]
toList input = read ("[" ++ input ++ "]")

main = do
   putStrLn "Enter a list of numbers (separated by comma):"
   input <- getLine
   print $ k (toList input)

3 个答案:

答案 0 :(得分:1)

有以下方法。

1)创建一个列表pf对,它们都是[[10,10),(10,15),..,(15,10),(15,3)..]的组合。 现在,您可以在此列表上使用简单的 any 函数来检查是否有任何一对加起来等于给定的数字。

getCoupleList :: [a]->[(a,a)]
getCoupleList [] = []
getCoupleList [x] = []
getCoupleList (x:xs) = map (\y->(x,y)) xs ++ getCoupleList xs

getSumOfCoupleList :: Num a => [(a,a)]->[a]
getSumOfCoupleList xs = map (\x -> fst x + snd x) xs 

isSum :: [Int]->Int->Bool
isSum xs k = any (==k) $ (getSumOfCoupleList.getCoupleList) xs

或直接检查wuthout getSumOfCoupleList

isSum xs k = any (\(a,b)-> a + b == k) $ (getSumOfCoupleList.getCoupleList) xs

如果您选择创建情侣列表并找到不需要的总和。我们可以通过简单的更改直接获得总和列表。

getSumList :: Num a=>[a]->[a]
getSumList [] = []
getSumList [x] = []
getSumList (x:xs) = map (+x) xs ++ getSumList xs

isSum1 :: [Int]->Int->Bool
isSum1 xs k = any (==k) $ getSumList xs 

2)通过从17中减去每个元素,从给定列表中创建另一个列表。现在只需检查第二个列表中是否存在第一个列表中的任何数字。

isSum2 :: [Int]->Int->Bool 
isSum2 xs k = let newList = map (k-) xs
                  intersectList = xs `intersect` newList
                  in not (null intersectList)

答案 1 :(得分:0)

这是一种幼稚的方法,未经优化,仅显示示例。

toList :: String -> [Integer]
toList input = read ("[" ++ input ++ "]")



check :: Integer -> [Integer] -> Bool 
check k (x:xs) = if ((k-x) `elem` xs) 
         then True
         else (check k xs)
check k x = False 

main = do
let k = 12
 putStrLn "Enter a list of numbers (separated by comma):"
 input <- getLine
 print $  (check k  (toList input))

答案 2 :(得分:0)

最近在一次采访中有人问我同样的问题,这是我的答案之一

import util
arr = [10, 15, 3, 8]
k = 17
for i in range(0, len(arr)):
    arr_new.append(abs(arr[i] -17))


res= list(set(arr).intersection(arr_new))

if (len(res)>0):
    print(str(res[0]) + " + " + str(res[1]) +"= "+ str(k ))
else:
    print("No numbers add up to k")