如何在 Haskell 中编写一个函数,它从一个 Int 中每隔一个数字获取一个数字并将其添加到一个结果 Int 中?

How to code a function in Haskell which takes every other digit from an Int and adds it to a result Int?

我想创建一个标题中提到的功能。具体是把数字倒序相加,在测试用例中可以看到:12 -> 1; 852369 -> 628; 1714 -> 11; 12345 -> 42; 891 -> 9; 448575 -> 784; 4214 -> 14

主要思想是,当数字大于 99 时,它进入辅助函数,该函数具有 i - 指示符(如果数字位于偶数位置)和 res(用于存储结果)。 Helper 开始循环 n,因为它检查当前数字是否在偶数位置并将其添加到结果中。

到目前为止,我已经尝试了以下代码:

everyOther :: Int -> Int
everyOther n
  | n < 10 = error "n must be bigger than 10 or equal"
  | n < 100 = div n 10
  | otherwise = helper n 0 0
  where
      helper :: Int -> Int -> Int -> Int
      helper n i res
        | n < 100 = res
        | i == 1 = helper (div n 10) (i - 1) (res + (mod n 10)*10)
        | otherwise = helper (div n 10) i res

如有任何帮助,我们将不胜感激!

你可以用mod (div x 10) 10得到x的最后一位。您可以将其与累加器一起使用,该累加器通过每次乘以​​ 10 来累加值,因此:

everyOther :: Int -> Int
everyOther = go 0
    where go a v
              | v < 10 = a
              | otherwise = go (10*a + mod (div v 10) 10) (div v 100)

如果 v 因此小于 10,我们可以 return 累加器,因为不再有“其他数字”。如果不是这种情况,我们将 a 乘以 10,然后添加 mod (div v 10) 10 以将另一个数字添加到它,并递归除以 100 的值将其移动两个位置右边。

我们可以改进这一点,因为 , by making use of quotRem :: Integral a => a -> a -> (a, a):

everyOther :: Int -> Int
everyOther = go 0
    where go a v
              | v < 10 = a
              | otherwise = let (q, r) = v `quotRem` 100 in go (10*a + r `quot` 10) q

因此,我们在这里使用除以 100 的余数,从而避免额外的模数。