gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:27:35 26 4
gpt4 key购买 nike

我想创建一个标题中提到的函数。具体是把数字倒序相加,在测试用例中可以看到: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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com