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

时间:2017-03-23 20:33:17

标签: haskell

我有一个输入整数:23415423

我的程序可以将它分成一个数组并加以总结,但我只需要奇数。
我试过?^元素但没有工作。

lsum :: Num a => [a] -> a
lsum [] = 0
lsum (h:t) = h + sum t

2 个答案:

答案 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..]