Haskell实现欧拉函数eTotient输出结果不符合预期问题排查
问题分析
- 返回值类型与需求不匹配:你定义的
eTotient函数类型签名为Int -> [Int],内部通过filter直接返回符合互质条件的整数列表,和预期返回计数的要求不符,需要对筛选结果调用length函数获取列表长度。 - 遍历区间遗漏边界值:正整数1和所有正整数都互质,你当前的遍历区间为
[2..(n-1)],漏掉了1,会导致最终计数比正确值少1。以测试用例eTotient 73为例,73是质数,1到72共72个数都和73互质,现有区间仅能筛选出2到72共71个数,结果不符合预期。 - 潜在优化点:你代码中用到的
divides、isPrime函数未给出实现,若这两个函数存在逻辑错误也会影响互质判断结果。判断两个数互质可以直接使用内置的gcd函数,逻辑更简洁,可替代你现有isCoprime、isCoprime2、divisorCoPrime、divisorCoPrime2四个函数的实现,降低出错概率。
修正方案
最小改动版本(保留你原有其他函数逻辑)
仅修改eTotient函数的类型签名和实现即可:
eTotient :: Int -> Int eTotient n = length $ filter (isCoprime n ) [1..(n-1)]
修改后运行eTotient 73即可得到预期输出72。
简化实现版本
使用内置gcd函数简化整个逻辑,无需额外实现互质判断相关的辅助函数:
eTotient :: Int -> Int eTotient n = length $ filter (\x -> gcd n x == 1) [1..n-1]
内容的提问来源于stack exchange,提问作者AxelCagira
相关产品推荐
相关产品推荐

