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