将数字从 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))
Y
和 X
在这里并不重要:如果 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)
我在使用球拍时遇到了一些问题。作业要求我编写一个程序,将任何数字从 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))
Y
和 X
在这里并不重要:如果 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)