Haskell列表推导式实现三位数素数函数返回空问题排查
问题分析与修正
你的代码返回空列表的核心问题是素数判断的除数范围错误:
- 你当前的除数列表是
[2..max a b],这意味着每个待判断的数n都会被检查到包含自身在内的所有数。而任何数n对自身取余结果都是0,导致all (\x -> nmodx /= 0)这个条件永远不成立,自然没有元素能被筛选出来。
另外,就算把除数范围改成[2..n-1],效率也极低——判断素数只需要检查到n的平方根就足够了:如果n存在大于其平方根的因数,必然对应一个小于平方根的因数,无需多余检查。
修正后的代码
primeNumbers :: Int -> Int -> [Int] primeNumbers a b = [n | n <- [max a 100 .. b], all (\x -> n `mod` x /= 0) [2..floor (sqrt (fromIntegral n))]]
关键改动说明
- 范围简化:直接用
max a 100作为区间起点,替代原代码中n > 99的判断,更简洁地确保只处理三位数及以上的数。 - 除数范围优化:将除数列表改为
[2..floor (sqrt (fromIntegral n))],通过计算n的平方根并取整,大幅减少需要检查的除数数量,同时保证素数判断的正确性。
调用primeNumbers 100 200即可得到你预期的素数列表。
内容的提问来源于stack exchange,提问作者Etoile
相关产品推荐
相关产品推荐

