Haskell如何遍历数字范围并生成指定偶数列表?
用递归实现Haskell的偶数范围筛选函数
首先明确Haskell里的函数签名应为 foo :: Int -> Int -> [Int](Haskell的列表语法是[Int]而非Int[])。递归实现的核心是确定基线条件和递归步骤:
基础递归实现(逐个检查)
思路直接:从startNum开始逐个遍历到endNum,判断每个数是否为偶数,符合条件就加入结果列表,直到遍历超出范围。
foo :: Int -> Int -> [Int] foo startNum endNum -- 基线条件:当前数超过endNum,返回空列表终止递归 | startNum > endNum = [] -- 当前数是偶数,将其加入结果,继续递归下一个数 | startNum `mod` 2 == 0 = startNum : foo (startNum + 1) endNum -- 当前数不是偶数,直接递归处理下一个数 | otherwise = foo (startNum + 1) endNum
测试示例:foo 5 10 会返回 [6,8,10],完全符合需求。
优化版递归(直接遍历偶数)
上面的实现会逐个检查每个数,我们可以优化:先找到第一个大于等于startNum的偶数,之后每次直接加2递归,减少不必要的判断:
foo :: Int -> Int -> [Int] foo startNum endNum = let firstEven = if startNum `mod` 2 == 0 then startNum else startNum + 1 in if firstEven > endNum then [] else firstEven : foo (firstEven + 2) endNum
这个版本效率更高,尤其在范围很大时优势明显。
内容的提问来源于stack exchange,提问作者Ichigo Uzumaki
相关产品推荐
相关产品推荐

