如何仅对 Haskell 中的奇数索引数字求和



我有一个输入整数: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..]

最新更新