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

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"))

代码核心问题

  1. 逻辑偏离真因数求和:N函数的逻辑完全错误,它在判断sum是否为num的因数,递归时还将sum与num相乘,和“计算真因数之和”的需求完全不符。真因数是指除自身外能整除原数的数,比如6的真因数是1、2、3,和为6,属于完美数。
  2. 变量作用域错误:perfect函数中直接使用num和sum,但这两个变量既不是该函数的参数,也没在其作用域内定义,运行时会直接报错。
  3. 递归缺少分支处理:N函数的第二个if没有else分支,当(modulo num sum)不等于0时,递归没有返回值,会陷入无意义的循环或卡住。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:35:27