问题描述
我正在尝试编写一个递归函数,以求出一个数字列表,并返回一个Bool
来确定总和是否可以被5整除。但是,我无法使其工作。
div5 :: [Int] -> Bool
div5 (x:xs)
| total `mod` 5 == 0 = True
| otherwise = False
where
total = total + x
解决方法
表达式where total = total + x
并没有多大意义,因为如果您说total
等效于total + x
,因此{{1 }},(total + x) + x
等
一个简单的解决方案是利用sum :: (Foldable f,Num a) => f a -> a
对数字求和,然后检查结果是否等于((total + x) + x) + x
:
0
或采用无点表示法:
div5 :: (Foldable f,Integral a) => f a -> Bool
div5 xs = mod (sum xs) 5 == 0
例如:
div5 :: (Foldable f,Integral a) => f a -> Bool
div5 = (0 ==) . (`mod` 5) . sum
这不仅适用于列表,而且还适用于所有Prelude Data.List> div5 [1,4,2,5]
False
Prelude Data.List> div5 [1,5,3]
True
类型,例如Foldable
,Maybe
等。
但是,如果值很大,或者元素的数量很大,这将给出错误的结果,因为那样一来,就无法再用数字类型来表示总和。但是,我们不需要计算总和,我们可以先计算每个元素的Tree
,然后将其总和再次等于(`mod` 5)
,然后得出总和{{ 1}},因此我们可以检查它是否为0:
mod 5
您可以使用帮助程序函数将其转换为递归函数,该函数执行递归以汇总值(或其等价模块5)。我将其保留为练习。