对于类,我必须编写一个带正整数n的函数,并返回scheme中n个奇数位的和。到目前为止,我有我的基本情况,如果n等于0然后0.但我不知道如何继续。
(define sumOddDigits
(lambda (n)
(if (= n 0)
0
测试用例:
(sumOddDigits 0) → 0
(sumOddDigits 4) → 0
(sumOddDigits 3) → 3
(sumOddDigits 1984) → 10
答案 0 :(得分:0)
你可以使用一个功能循环有效地做到这一点:
(define (sumOddDigits n)
(let loop ([n n])
(cond [(zero? n) 0]
[else
(let-values ([(q r) (quotient/remainder n 10)])
(+ (if (odd? r) r 0)
(loop q)))])))
答案 1 :(得分:0)
可以使用以下函数获取数字列表,该函数使用名为let':
(define (getDigits n)
(let loop ((ol '()) ; start with an empty outlist
(n n))
(let-values (((q r) (quotient/remainder n 10)))
(if (= q 0) (cons r ol)
(loop (cons r ol) q)))))
然后可以使用奇数应用过滤器?函数获取列表的所有奇数元素 - 然后应用' apply'功能与' +'添加所有这些元素:
(apply + (filter
(lambda(x)
(odd? x))
digitList))
以下可以是完整的功能:
(define (addOddDigits N)
(define (getDigits n)
(let loop ((ol '())
(n n))
(let-values (((q r) (quotient/remainder n 10)))
(if (= q 0) (cons r ol)
(loop (cons r ol) q)))))
(define digitList (getDigits N))
(println digitList)
(apply + (filter
(lambda(x)
(odd? x))
digitList)))
测试:
(addOddDigits 156)
输出:
'(1 5 6)
6
答案 2 :(得分:0)
你的基础是n< 10.因为你是最后一位数。 然后你需要检查它是否奇怪,如果是,则返回它。否则,返回加法限定符(0)。
如果n> 10,你剩下第一个数字,然后测试它奇数。 如果是奇数,则将其添加到递归调用中,发送10的商(削减您刚刚添加的数字)。 否则,你递归调用商的商数为10,而不添加当前数字。
这是递归形式(Scheme LOVES递归):
(define add-odds
(lambda (n)
(if(< n 10)
(if(= (remainder n 2) 1)
n
0)
(if(= (remainder (remainder n 10) 2) 1)
(+ (remainder n 10) (add-odds (quotient n 10)))
(add-odds(quotient n 10))))))
答案 3 :(得分:0)
首先使用简单的递归实现获得一个(反转的)数字列表:
(define (list-digits n)
(if (zero? n) '()
(let-values ([(q r) (quotient/remainder n 10)])
(cons r (list-digits q)))))
然后过滤奇数并求和:
(define (sum-of-odd-digits n)
(apply + (filter odd? (list-digits n))))
注意:(list-digits 0)
返回'()
,但以后可以使用。
更准确的list-digits
迭代实现(以正确的顺序产生数字列表):
(define (list-digits n)
(define (iter n acc)
(if (zero? n) acc
(let-values ([(q r) (quotient/remainder n 10)])
(iter q (cons r acc)))))
(iter n '()))