返回数字的奇数位总和

时间:2016-10-25 00:01:02

标签: racket

对于类,我必须编写一个带正整数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

4 个答案:

答案 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 '()))