使用递归计算在列表中可以将3个整除的数字?

时间:2016-01-05 16:46:02

标签: haskell

这让我很困惑,我知道我对哈斯克尔有一个很好的了解,但是我不能得到整个"计算"部分工作。

recursion :: [Int] -> Int
recursion [] = []
recursion (x:xs) = if x `mod` == 3 then.. +1 +  recursion xs

我知道它出了什么问题,整个然后+1部分但是不能做到

计算在给定列表中可以将3个整除的数字。

2 个答案:

答案 0 :(得分:6)

要编写递归解决方案,首先需要考虑基本情况。正如文森特指出的那样,你的基本案件存在严重问题。输出[]的类型为[a],但应为Int类型。问问自己:

  1. 结果应该是什么类型?
  2. 在空列表中,有多少列表元素可以被3整除?
  3. 对于递归情况,不清楚你错过了什么,但它可能只是语法。你有一般的想法。

    recursion :: [Int] -> Int
    recursion [] = -- base case goes here
    recursion (x:xs) = if x `mod` 3 -- what is the type of (x `mod` 3)? Haskell isn't C!
                       then 1 + something
                       else somethingelse
    

答案 1 :(得分:2)

这应该适合你:

使用空列表作为返回0的边缘大小写,因此每当列表中的一个元素可以被3分割而不休息时,您可以添加1。如果您可以将元素除以3而不休息,则添加1并使用列表再次调用该函数,否则您只需添加0,例如

recursion :: [Int] -> Int
recursion [] = 0
recursion (x:xs) = if x `mod` 3 == 0 then 1 + recursion xs else 0 + recursion xs