Scheme语言求≤n素数列表代码问题:输入n=1时输出异常
解决方案
问题出在没有处理n小于2的边界场景,直接进入了初始包含2的循环逻辑。只需要在函数开头添加边界判断,就能在不破坏原有正常用例逻辑的前提下修复问题:
修改后的完整代码:
(define (primes n) ; 先处理n<2的情况,直接返回空列表 (if (< n 2) '() (let loop((result `(2)) (i 3)) (cond ((> i n)(reverse result)) (else (loop (if (divide-any? i result) result (cons i result)) (+ i 2))))))) (define (divide? n1 n2) (zero? (modulo n1 n2))) (define (divide-any? n ls) (do ((ls ls (cdr ls))) ((or (null? ls) (divide? n (car ls))) (not (eqv? '() ls)))))
修改说明
- 新增的
(if (< n 2) '() ...)分支直接拦截了n=1、n=0等小于2的输入,返回符合预期的空列表。 - 当n≥2时,依旧执行原来的循环逻辑,保留对正常测试用例的适配(比如输入3返回
(2 3)、输入11返回(2 3 5 7 11))。
另外注意:你提到输入10返回(1,3,5,7)是错误的,1不是素数,修改后的代码输入10会返回正确的素数列表(2 3 5 7)。
内容的提问来源于stack exchange,提问作者yojozaok21
相关产品推荐
相关产品推荐

