计算球拍BSL中给定数​​字的适当除数的总和

时间:2018-11-07 14:13:03

标签: scheme lisp racket racket-student-languages dr.racket

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

示例:

输入: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的东西。

2 个答案:

答案 0 :(得分:1)

第1步:了解代码在做什么。为什么还有其他参数?这是怎么回事?

第2步:您如何称呼它?这对i意味着什么?

第3步:您有什么不同的操作,以便不对其余数字进行校验?

答案 1 :(得分:0)

要满足条件strictly smaller than itself,请用(sum-of-proper-divisors 20 (sub1 20))进行调用,然后您会得到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