作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个标题中提到的函数。具体是把数字倒序相加,在测试用例中可以看到: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,我们可以返回累加器,因为不再有“其他数字”。如果不是这种情况,我们将 a
乘以 10
,然后添加 mod (div v 10) 10
以将另一个数字添加到它, 并递归将值除以 100 将其向右移动两个位置。
我们可以改进它,因为 @Daniel Wagner says , 通过使用 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 的余数,从而避免额外的模数。
关于haskell - 如何在 Haskell 中编写一个函数,该函数从 Int 中获取每隔一个数字并将其添加到结果 Int 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71436572/
我是一名优秀的程序员,十分优秀!