我有一个输入整数:23415423
我的程序可以将其拆分为一个数组并将它们相加,但我只需要奇数个。
我已经尝试了 ?^ 元素但不起作用。
lsum :: Num a => [a] -> a
lsum [] = 0
lsum (h:t) = h + sum t
首先,您尝试的问题在于您只是在其余数字上调用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
当然还有很多其他方法,但我想这可能会激励你自己寻找更好的解决方案,因为这看起来像是学校的作业。
您可以添加索引,仅筛选所需的索引,然后求和。
lsum xs = sum $ map fst $ filter (odd . snd) $ zip xs [1..]