Преобразовать номер в список цифр - PullRequest
3 голосов
/ 04 ноября 2011

Как мне преобразовать число в список цифр?

В настоящее время я делаю:

;; (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 ]

6 голосов
/ 05 ноября 2011

Вот как я бы сделал это в Racket:

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

Это проблема, для которой unfold была разработана. : -D

3 голосов
/ 04 ноября 2011

Это функция цифр моей стандартной прелюдии:

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

Ваша версия функции перемещается между строками и числами; моя версия чисто арифметическая. Моя версия также предусматривает основы, отличные от десятичной.

0 голосов
/ 05 ноября 2011

«Лучше» всегда открыт для определения, но немного более прямой / очевидный способ будет выглядеть примерно так:

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

Что касается того, "хорошо", "плохо", "лучше" и т. Д., Я думаю, это зависит от того, что вы хотите. Нет сомнений в том, что вы можете найти более эффективный, универсальный и т. Д. Код (на самом деле @ user448810 уже опубликовал его). Это больше того, что я считаю примером кода для чего-то вроде введения в Scheme - акцент делается на простоте и легкости понимания / объяснения 1 . Я ожидаю, что почти любой человек с минимумом голой экспозиции с каким-либо языком, похожим на Лисп, и общим представлением о том, как осуществляется такое преобразование чисел, должен иметь возможность довольно быстро выяснить все, что здесь происходит легко.


  1. Даже за счет некорректного поведения в некоторых угловых случаях - например, как есть, он даже пытается корректно работать только для строго положительных чисел.
...