我有一个输入整数:23415423
我的程序可以将它分成一个数组并加以总结,但我只需要奇数。
我试过?^元素但没有工作。
lsum :: Num a => [a] -> a
lsum [] = 0
lsum (h:t) = h + sum t
答案 0 :(得分:2)
首先,您尝试的问题是,您只需在其余数字上调用sum
,这不是您的lsum
,那么您希望它如何跳过元素?所以你可能想把lsum
放在那里并进行递归调用。
现在你想控制你的递归。
如果你坚持走过一个数字列表,你可以reverse
它,然后让你的递归跳过元素(或者,你必须递归到列表的末尾并开始从那里吃掉它,在这种情况下,识别要包括在总和中的哪些元素会更加混乱:
lsum = lsum' . reverse where
lsum' :: Num a => [a] -> a
lsum' [] = 0
lsum' [_] = 0
lsum' (_ : odd : tail) = odd + lsum' tail
或者你可以在列表的两个消费者之间交替
lsum' :: Num a => [a] -> a
lsum' [] = 0
lsum' (_ : tail) = lsum'' tail
lsum'' :: Num a => [a] -> a
lsum'' [] = 0
lsum'' (odd : tail) = odd + lsum' tail
当然还有很多其他方法,但我想这可能会激励您自己寻找更好的解决方案,因为这似乎是一项学校作业。
答案 1 :(得分:1)
您可以添加索引,仅过滤所需的索引,然后求和。
lsum xs = sum $ map fst $ filter (odd . snd) $ zip xs [1..]