将数字从 10 进制转换为 4 进制的 Racket 简单程序

Racket simple procedure for converting number from base 10 to base 4

我在使用球拍时遇到了一些问题。作业要求我编写一个程序,将任何数字从 10 进制转换为 4 进制,解决方案应该写在一个列表中。例如 (convert-to-base-four 12) -> (list 3 0) 现在我已经编写了一个程序,但它将每个数字插入到一个单独的列表中。 这是我的代码。

(define (convert-to-base-four number)
  (cond
    [(<= number 3) (cons number empty)] 
    [(> number 3)  (reverse (list (remainder number 4)
                    (convert-to-base-four (floor (/ number 4)))))]))

有人知道怎么办吗? 非常感谢

尝试在您的列表中使用追加 :)

祝作业愉快 ;)

AlexKnauth 的评论是您需要遵循的评论 – 您必须为您的函数定义并遵守严格的 domain (input) and codomain(输出)

;; from your code
(list Y
      (convert-to-base-four X))

YX 在这里并不重要:如果 convert-to-base-four returns 一些值的列表和对 [=15= 的递归调用] – returns 一个 list – 你最终会得到一个列表列表!

正如另一个人指出的那样,一个解决方案是使用 append – 但是 beware, it's a trap

(define (base4 n)
  (if (< n 4)
      (list n)
      (append (base4 (floor (/ n 4)))
              (list (remainder n 4)))))

(displayln (base4 12))     ; (3 0)
(displayln (base4 13))     ; (3 1)
(displayln (base4 14))     ; (3 2)
(displayln (base4 15))     ; (3 3)
(displayln (base4 16))     ; (1 0 0)
(displayln (base4 123456)) ; (1 3 2 0 2 1 0 0 0)

更好的解决方案是避免昂贵地使用 append——这里我们使用 named let loop 和两个循环状态变量 m 和 [=21] =]

(define (base4 n)
  (let loop ((m n) (acc empty))
    (if (< m 4)
        (cons m acc)
        (loop (floor (/ m 4))
              (cons (remainder m 4) acc)))))

(displayln (base4 12))     ; (3 0)
(displayln (base4 13))     ; (3 1)
(displayln (base4 14))     ; (3 2)
(displayln (base4 15))     ; (3 3)
(displayln (base4 16))     ; (1 0 0)
(displayln (base4 123456)) ; (1 3 2 0 2 1 0 0 0)