将数字转换为数字列表

时间:2011-11-04 19:01:03

标签: 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))))

    (define (char->num c)
      (- (char->integer c) 48)))

    (num->list n)))

但想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:6)

以下是我在Racket中的表现:

(require srfi/1 srfi/26)
(define (digits->list num (base 10))
  (unfold-right zero? (cut remainder <> base) (cut quotient <> base) num))

这是unfold专为此而设计的问题。 :-D

答案 1 :(得分:3)

这是我的标准序曲的digits功能:

(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))))))

你的函数版本在字符串和数字之间来回传递;我的版本纯粹算术。我的版本还提供了十进制以外的基数。

答案 2 :(得分:0)

“更好”总是对定义开放,但更直接/更明显的方式是这样的:

(define (int->list n) (if (zero? n) `()
                          (append (int->list (quotient n 10)) (list (remainder n 10)))))

至于这是“好”,“坏”,“更好”等,我想这取决于你想要什么。毫无疑问,您可以找到更高效,更通用等的代码(事实上,@ user448810已经发布了一些代码)。这更像是我想到的示例代码,例如对Scheme的介绍 - 重点在于简单易懂/解释 1 。我希望几乎所有最少接触一些类似Lisp语言的人以及如何进行这种数字转换的一般想法应该能够很快找出这里发生的一切/易于。


  1. 即使以某些极端情况的不正确行为为代价 - 例如,它仍然只是尝试正确地使用严格正数。