2

我想知道如何编写一个函数来计算大于 1 的整数的适当除数之和。

(define (sum-of-proper-divisors n)
          (cond
           [(= n 1) 1]
           [(= 0 (remainder n (sub1 n)))
            (+ (remainder n (sub1 n)) (sum-of-proper-divisors (sub1 (sub1 n))))]
           [else (sum-of-proper-divisors (sub1 n))]))

这是我写的代码,但是,它不起作用。它永远不会停止评估,因为它总是会做 n-1。而且我不知道如何解决这个问题。此外,可能还有其他问题。当除数变为 1 时,如何设置使函数停止计算的限制?

4

1 回答 1

1

您将n要查找除数的数字与所述除数混淆了。请注意,n永远不会改变,必须在每一步修改的是当前正在测试的整数(可能的除数)。为此,您需要传递两个参数:

(define (sum-of-proper-divisors n i)
  (cond
    [(= i 1) 1]
    [(= (remainder n i) 0)
     (+ i (sum-of-proper-divisors n (sub1 i)))]
    [else (sum-of-proper-divisors n (sub1 i))]))

像这样称呼它,开头i必须小于一个单位n

(sum-of-proper-divisors 10 9)
=> 8

如果有两个参数让您感到困扰,有几种方法可以传递单个参数,例如使用 named let

(define (sum-of-proper-divisors n)
  (let loop ((i (sub1 n)))
    (cond
      [(= i 1) 1]
      [(= (remainder n i) 0)
       (+ i (loop (sub1 i)))]
      [else (loop (sub1 i))])))
于 2013-11-04T02:01:42.813 回答