SCHEME递归完美数字(初学者,希望很容易修复)

时间:2012-09-11 23:46:39

标签: formatting scheme racket perfect-numbers

我的完美号码功能有问题。代码的目的是确定数字是否是完美数字,这意味着它等于其除数的总和。例如:6。我的代码有问题。这是我的功能:

(define (is-perfect x)
  (define (divides a b) (= (modulo b a) 0))
  (define (sum-proper-divisors y)
    (if (= y 1)
        1
        (if (divides y x)
            (+ y (sum-proper-divisors (- y 1)))
        (if (= x 1)
            #f
            (= (sum-proper-divisors (- x 1)
                                    x)))))))

1 个答案:

答案 0 :(得分:2)

你几乎得到了它!但是有几个问题。首先,您在sum-proper-divisors中遗漏了一个案例:您问y是否为(divides y x)是否y,但如果x没有划分if会发生什么? ?

第二个问题是,最后一个sum-proper-divisors表达式必须在两个辅助程序的定义之外,目前它是 (define (is-perfect x) (define (divides a b) (= (modulo b a) 0)) (define (sum-proper-divisors y) (cond ((<= y 1) 1) ((divides y x) (+ y (sum-proper-divisors (- y 1)))) (else <???>))) ; what goes in here? (if (= x 1) #f (= (sum-proper-divisors (- x 1)) x))) 内。正确地缩进代码会更容易找到这种错误。

这是正确解决方案的外观,因为这看起来像家庭作业我会让你填补空白:

{{1}}