如何在 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 的余数,从而避免额外的模数。
我想创建一个标题中提到的功能。具体是把数字倒序相加,在测试用例中可以看到: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 的值将其移动两个位置右边。
我们可以改进这一点,因为 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 的余数,从而避免额外的模数。