设计一个名为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
的东西。
答案 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