【问题标题】:How do I check if all odd numbers are greater than 10 in a list如何检查列表中的所有奇数是否都大于 10
【发布时间】:2021-12-07 05:42:24
【问题描述】:

我正在尝试使用递归 eval :: Int -> Bool 编写一个函数,如果给定一个每个奇数都大于 10 的列表,则该函数返回 true。例如:

eval [] == True
eval [1] == False
eval [2] == True
eval [1, 11, 21] == False
eval [2, 12, 22] == True
eval [21, 11] == True

我必须使用递归来做到这一点,并且我有一个基本代码:

eval :: [Int] -> Bool
eval [] = True
eval (x:xs) | mod x 2/= 0 && x > 10 = True
            | otherwise = eval xs

代码运行,但它不适用于将大于 10 的奇数作为第一个输入的列表,因为它将列表的第一个值作为标准。我认为首先按升序对列表进行排序,然后执行递归是可行的,这是正确的,如果是,我该如何实现它?

【问题讨论】:

    标签: haskell recursion


    【解决方案1】:

    如果mod x 2 /= 0 && x > 10,您应该返回True。到那时,我们仍然需要寻找其余的数字。

    因此,只有当项目是 even 或项目大于 10 时,我们才能在尾部递归。确实,如果项目是 even,则足以继续,如果不是,我们需要验证该数字是否大于 10。

    因此eval 函数可以与:

    eval :: [Int] -> Bool
    eval [] = True
    eval (x:xs) | even x || x > 10 = eval xs
                | otherwise = False
    

    我们可以简化为:

    eval :: [Int] -> Bool
    eval [] = True
    eval (x:xs) = (even x || x > 10) && eval xs
    

    我们也可以在不使用递归的情况下实现函数,例如使用foldr 模式:

    eval :: (Foldable f, Integral a) => f a -> Bool
    eval = foldr (\x -> ((even x || x > 10) &&)) True
    

    或与all :: Foldable f => (a -> Bool) -> f a -> Bool合作:

    eval :: (Foldable f, Integral a) => f a -> Bool
    eval = all (\x -> even x || x > 10)
    

    【讨论】:

    • @idontknowhowtocode:因为foldr ... False 产生一个函数,而该函数将一个列表作为参数。
    • @idontknowhowtocode:foldr 模式替换函数中列表中的每个:(此处为\x -> (even x || x > 10) && xs,并使用True 表示空列表情况[]
    • all 绝对是最清晰的,但不满足OP编写自己的递归的要求。 \x -> even x || x > 10 可以写成 (||) <$> even <*> (>10)liftA2 (||) even (>10) 如果你有那种心情。
    • @dfeuer:我同意 foldrany 不使用显式递归,这更多是为了展示如何使用 Haskell 而无需定义递归函数。
    【解决方案2】:

    您几乎可以只写下问题说明:

    f :: [Int] -> Bool
    f = all (> 10) . filter odd
    -- (And because you are supposed to write your own recursion)
      where all p (x : xs) = p x && all p xs
            all p [] = True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多