输入是包含9个元素的列表。
我想检查前8个元素的和/ 10的余数(下面的算法,taj' s第二行)是否等于最后一个(第9个)元素。
目前我的程序计算剩余部分,但我无法弄清楚如何检查它。我尝试了几种方法。
oddS :: Int-> Int
oddS x = x*3
evenS :: Int -> Int
evenS y = y*7
taj :: [Int] -> Int
taj (a:b:c:d:e:f:g:h:w) = (oddS a + evenS b + oddS c + evenS d + oddS e + evenS f + oddS g + evenS h) `mod` 10
我知道这不是最好的解决方案,但它可以胜任。
Willem帮助下的另一种解决方案。
check :: [Int] -> Bool
check xs = xn == taj xs
where xn = last xs
答案 0 :(得分:2)
我想检查前8个元素的sum / 10的余数是否等于最后一个(第9个)元素。
这是一种验证算法。它就是这样的。如果前8个元素(奇数索引元素* 3和偶数索引元素* 7的总和)mod 10等于最后一个元素,则输入列表有效。 - 评论
你也可以使用 recursion 来检查条件,使用累加器(或者两个来检查长度)来累积运行总和并在到达最后一个元素时检查它。如下所示:
check9 :: [Int] -> Bool
check9 = check9' 8 0
where check9' n s [xn] = n == 0 && s `mod` 10 == xn
check9' n s (x:x2:xs) = check9' (n-2) (s+3*x+7*x2) xs
check9' _ _ _ = False
更优雅的解决方法是使用sum :: Num a => [a] -> a
,zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
,cycle :: [a] -> [a]
和splitAt :: [a] -> a
等内置词:
-- alternative version
check9 :: [Int] -> Bool
check9 xs | (xi,[xn]) <- splitAt 8 xs = xn == mod (sum (zipWith (*) xi $ cycle [3,7])) 10
| otherwise = False