Scheme 将数字转换为数字列表
如何将数字转换为数字列表 我目前正在做:Scheme 将数字转换为数字列表,scheme,racket,Scheme,Racket,如何将数字转换为数字列表 我目前正在做: ;; (num->list 12345) -> '(1 2 3 4 5) (define (num->list n) (local ((define (num->list n) (map (lambda (c) (char->num c)) (string->list (number->string n)))) (defin
;; (num->list 12345) -> '(1 2 3 4 5)
(define (num->list n)
(local
((define (num->list n)
(map (lambda (c)
(char->num c))
(string->list (number->string n))))
(define (char->num c)
(- (char->integer c) 48)))
(num->list n)))
但是我想知道是否有更好的方法。这是我的标准前奏曲的功能:
(define (digits n . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((n n) (d '()))
(if (zero? n) d
(loop (quotient n b)
(cons (modulo n b) d))))))
您的函数版本在字符串和数字之间来回转换;我的版本纯粹是算术。我的版本还提供了十进制以外的基数。更好的“总是可以定义的,但更直接/明显的方式是这样的:
(define (int->list n) (if (zero? n) `()
(append (int->list (quotient n 10)) (list (remainder n 10)))))
至于这是否是“好”、“坏”、“更好”等等,我想这取决于你想要什么。毫无疑问,您可以找到更高效、更通用等的代码(事实上,@user448810已经发布了一些)。这更像是我认为的Scheme简介之类的示例代码——重点在于简单易懂/易于解释1。我希望几乎任何一个接触过类似Lisp语言的人,只要对如何进行这种数字转换有一个大致的了解,就能够相当快/容易地理解这里发生的一切
以下是我在球拍中的表现:
(require srfi/1 srfi/26)
(define (digits->list num (base 10))
(unfold-right zero? (cut remainder <> base) (cut quotient <> base) num))
(需要srfi/1 srfi/26)
(定义(数字->列表编号(基数10))
(展开右零?(切割余数基数)(切割商基数)num)
这就是
展开
设计的问题类型:-DUgh,手动参数打开包装:-(谢天谢地,Racket实现了SRFI-89样式的可选参数(如我的帖子所示),并且这个问题被标记为Racket特定的。:-DExcept,append
+list
是Scheme编程中的反模式(<代码> CONS <代码> +代码>反转更为正统,尽管在这个例子中没有<代码>反向<代码>是必要的。因此,我不认为它是一个合适的“方案介绍”示例。