You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell列表推导式实现三位数素数函数返回空问题排查

问题分析与修正

你的代码返回空列表的核心问题是素数判断的除数范围错误:

  • 你当前的除数列表是[2..max a b],这意味着每个待判断的数n都会被检查到包含自身在内的所有数。而任何数n对自身取余结果都是0,导致all (\x -> n mod x /= 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))]]

关键改动说明

  1. 范围简化:直接用max a 100作为区间起点,替代原代码中n > 99的判断,更简洁地确保只处理三位数及以上的数。
  2. 除数范围优化:将除数列表改为[2..floor (sqrt (fromIntegral n))],通过计算n的平方根并取整,大幅减少需要检查的除数数量,同时保证素数判断的正确性。

调用primeNumbers 100 200即可得到你预期的素数列表。

内容的提问来源于stack exchange,提问作者Etoile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:37:08