Возвращает сумму нечетных цифр числа

#racket

#ракетка

Вопрос:

Для класса я должен написать функцию, которая принимает положительное целое число n и возвращает сумму нечетных цифр n в схеме. Пока что мой базовый вариант таков, что если n равно 0, то 0. Но я не уверен, как продолжить.

 (define sumOddDigits
     (lambda (n)
       (if (= n 0)
           0
  

Тестовые примеры:

 (sumOddDigits 0) → 0
(sumOddDigits 4) → 0
(sumOddDigits 3) → 3
(sumOddDigits 1984) → 10
  

Ответ №1:

Вы могли бы сделать это эффективно, используя один функциональный цикл:

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

Ответ №2:

Получить список цифр можно с помощью следующей функции, которая использует ‘named 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)))))
  

Тогда можно применить фильтр, используя odd? функция для получения всех нечетных элементов списка — и затем примените функцию ‘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
  

Ответ №3:

Ваш базовый вариант равен, если n < 10. Потому что тогда вы находитесь на последней цифре. Затем вам нужно проверить, является ли оно нечетным, и если да, то вернуть его. В противном случае верните определитель сложения (0).

Если n > 10, вы вычтите первую цифру, затем проверьте ее на нечетность. Если нечетная, то добавьте ее к рекурсивному вызову, отправив частное от 10 (удаляет только что добавленную цифру). В противном случае вы рекурсивно вызываете add-odds с коэффициентом 10, не добавляя текущую цифру.

Здесь это в рекурсивной форме (Схема ЛЮБИТ рекурсию) :

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

Ответ №4:

Сначала получите (обратный) список цифр с простой рекурсивной реализацией:

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