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)
    

    这就是
    展开
    设计的问题类型:-D

    Ugh,手动参数打开包装:-(谢天谢地,Racket实现了SRFI-89样式的可选参数(如我的帖子所示),并且这个问题被标记为Racket特定的。:-DExcept,
    append
    +
    list
    是Scheme编程中的反模式(<代码> CONS <代码> +代码>反转更为正统,尽管在这个例子中没有<代码>反向<代码>是必要的。因此,我不认为它是一个合适的“方案介绍”示例。