语言方案:找到适当的除数之和

时间:2013-11-04 01:15:08

标签: scheme racket

我想知道如何编写一个函数来计算大于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时,如何设置使函数停止计算的限制?

1 个答案:

答案 0 :(得分: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

如果有两个参数困扰你,有几种方法可以传递一个参数,例如使用一个名为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))])))