Scheme语言完美数求解代码调试咨询
求解完美数的Scheme代码问题
我刚学习Scheme,正在尝试编写求解完美数的代码——需要计算一个数的真因数之和,再和原数比较。但代码有时看似正常,却总会出现循环问题。以下是我的代码:
(define (N num sum) (if (= num 1) sum (if ( = ( modulo num sum ) 0) (N (- num 1)(* num sum))))) ;( + (sum (+ (N num sum) 1))) ;( - (N num sum) 1))) (print "Enter a positive integer: ") (define integer (read)) (define (perfect) (if (= num sum) (print "perfect")) (if (< num sum) (print "abundant")) (print "deficient"))
代码核心问题
- 逻辑偏离真因数求和:
N函数的逻辑完全错误,它在判断sum是否为num的因数,递归时还将sum与num相乘,和“计算真因数之和”的需求完全不符。真因数是指除自身外能整除原数的数,比如6的真因数是1、2、3,和为6,属于完美数。 - 变量作用域错误:
perfect函数中直接使用num和sum,但这两个变量既不是该函数的参数,也没在其作用域内定义,运行时会直接报错。 - 递归缺少分支处理:
N函数的第二个if没有else分支,当(modulo num sum)不等于0时,递归没有返回值,会陷入无意义的循环或卡住。 if语法错误:Scheme的if要求是(if 条件 真分支 假分支),你写的perfect函数里多个if未正确嵌套,导致无论什么情况都会打印"deficient"。
修复后的代码示例
; 计算n的真因数之和 (define (sum-proper-divisors n) (define (helper divisor current-sum) (cond ; 遍历到n的一半即可,大于n/2的因数只有n自身(不算入真因数) [(> divisor (/ n 2)) current-sum] [(= (modulo n divisor) 0) (helper (+ divisor 1) (+ current-sum divisor))] [else (helper (+ divisor 1) current-sum)])) ; 真因数从1开始遍历 (helper 1 0)) ; 判断数的类型:完美数、过剩数、亏数 (define (classify-number n) (let ([s (sum-proper-divisors n)]) (cond [(= s n) "perfect"] [(> s n) "abundant"] [else "deficient"]))) ; 主程序 (print "Enter a positive integer: ") (define input (read)) (print (classify-number input))
代码说明
sum-proper-divisors通过辅助函数helper遍历1到n/2的所有数,判断是否为原数的因数,累加求和。classify-number用let绑定因数和,再通过cond分支判断输出结果,避免了语法错误。- 递归有明确的终止条件:当除数超过
n/2时返回当前和,不会出现无限循环。
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

