1

设计一个名为 Racket 的函数findProperDivisor,它接受一个自然数并计算其所有适当除数的总和。自然数的适当除数是严格小于该数的除数。

例子:

输入:20

输出:22

//适当的除数:1 + 2 + 4 + 5 + 10 = 22

(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))]))

我在此页面上找到了此代码,但它给了我1+2+4+5+10+20=42我需要的代码22

我想通过使用递归和一个参数来编写这段代码cond。我正在使用初级学生语言 (BSL),它没有let定义之类的东西。

4

2 回答 2

1

第 1 步:了解代码在做什么。为什么有一个额外的参数?它发生了什么?

第2步:你怎么称呼这个?这意味着i什么?

第 3 步:您需要做些什么不同的事情才能使余数不与数字本身核对?

于 2018-11-07T22:01:07.673 回答
0

为了满足条件strictly smaller than itself,调用它(sum-of-proper-divisors 20 (sub1 20))then you get 22,从那时起,20 不算作除数。

由于您应该只使用一个数字作为参数来定义该函数, - 由于这种初学者语言的限制,我会将所需的函数定义为第二个函数:

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

(define (findProperDivisors n)
  (sum-of-proper-divisors n (sub1 n)))

(findProperDivisors 20) ;; => 22
于 2018-11-09T01:51:22.177 回答