Например,
я есть функция ниже, которая преобразует ввод чисел в вывод частично переведенных слов этих чисел.
Используя продукт и частное, он добавляет слово представление чисел при разбиении числа на группы.
Например:
(number-name 87969087) -> '(87 million 969 thousand 87)
(number-name 1000000) -> '(1 million)
Я пытаюсь завершить свою проблему, полностью переведя те числа, которые также меньше 1000. Я пытаюсь реализовать функцию менее 1000, которая будет отображать эти меньшие числа по мере составления списка. Рядом:
;; for less than 1000
; state words for 1-19
(define baseNumbers '(one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen))
а также
; state words for multiples of ten
(define multiples '(twenty thirty forty fifty sixty seventy eighty ninety))
так
(number-name 1110) -> '(one thousand one hundred ten)
Также было трудно придумать способ отображения входа 0 для отображения в виде нуля, делая так, чтобы ноль не отображался, если на входе было что-то отличное от 0.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
(define (number n)
(define units '(thousand million billion trillion quadrillion))
(define (nsplit n units acc lst)
(define q (quotient n 1000))
(define r (remainder n 1000))
(if (zero? n) lst
(cond [(zero? acc)
(if (zero? r)
(nsplit q units (add1 acc) lst)
(nsplit q units (add1 acc) (cons r lst)))]
[(zero? r)
(nsplit q (cdr units) acc lst)]
[else
(nsplit q (cdr units) acc (cons r (cons (car units) lst)))])))
(nsplit n units 0 empty))