簡體   English   中英

如何檢查列表元素的總和是否等於Haskell中的最后一個元素?

[英]How to check if sum of list elements are equal to the last element in Haskell?

輸入是一個包含9個元素的列表。

我想檢查前8個元素的sum / 10的余數(使用下面的算法,taj的第二行)是否等於最后一個(第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

我想檢查前8個元素的sum / 10的余數是否等於最后一個(第9個)元素。

這是一種驗證算法。 它就是這樣。 如果mod 8的前8個元素(奇數索引元素* 3和偶數索引元素* 7的總和)等於最后一個元素,則輸入列表有效。 -評論

您還可以使用遞歸來檢查條件,方法是使用累加器 (或兩個累加器來檢查長度),該累加器累加運行總和並在到達最后一個元素時對其進行檢查。 所以像這樣:

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] -> azipWith :: (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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM