Scheme 语言方案:求适当因子之和

Scheme 语言方案:求适当因子之和,scheme,racket,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-

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

您将要查找其除数的数字
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))])))

但是我想找到适当的除数之和,你的代码似乎计算了所有除数之和。我想一开始我必须等于n-1。我说得对吗?@Cylia是的,没错。我忽略了它们是适当的除数这一事实。我更新了我的答案,补充了一个问题,如果我想用这个函数作为另一个只有一个参数n的函数的助手,这个函数还能工作吗?我想知道它不会起作用,因为我在这个函数中有两个参数。@Cylia只是将这个函数用作助手,从单参数函数调用。或者使用a在内部定义两个参数的函数,而将外部函数保留为一个参数。无论如何,没有办法避免创建另一个函数,您需要两个参数,否则它将无法工作(正如您在代码中所观察到的),不幸的是,我不允许使用“named let”。在main函数中,如果我调用(适当除数之和n(sub1n)),它会工作吗?