34109 などの整数を取り、それを要素 3、4、1、0、9 のリストに入れるスキームで記述された私のプログラム用のサブルーチンが必要です。整数は任意の長さにすることができます。誰もこれのためのトリックを持っていますか? すべての場所でモジュロを使用することを考えましたが、それほど複雑であるべきではないと思います。
5301 次
3 に答える
4
私が考えることができる最も簡単な方法は、算術演算と末尾再帰を実装するための名前付きを使用することです。let
(define (number->list num)
(let loop ((num num)
(acc '()))
(if (< num 10)
(cons num acc)
(loop (quotient num 10)
(cons (remainder num 10) acc)))))
または、文字列操作を使用してこの問題を解決できます。
(define char-zero (char->integer #\0))
(define (char->digit c)
(- (char->integer c) char-zero))
(define (number->list num)
(map char->digit
(string->list (number->string num))))
これは 1 つの関数に圧縮できますが、上記のように問題をサブパートに分割すると理解しやすいと思います。
(define (number->list num)
(map (lambda (c) (- (char->integer c) (char->integer #\0)))
(string->list
(number->string num))))
とにかく、結果は期待どおりです。
(number->list 34109)
> '(3 4 1 0 9)
于 2012-10-11T14:30:21.900 に答える
2
このようなもの:
(define (num2list-helper num lst)
(cond ((< num 10) (cons num lst))
(else (num2list-helper (floor (/ num 10)) (cons (modulo num 10) lst)))))
(define (num2list num)
(num2list-helper num '()))
(num2list 1432)
itsbruce がコメントしたように、メイン関数内にヘルパー関数を非表示にできます。
(define (num2list num)
(define (num2list-helper num lst)
(cond ((< num 10) (cons num lst))
(else (num2list-helper (floor (/ num 10)) (cons (modulo num 10) lst)))))
(num2list-helper num '()))
(num2list 1432)
つづく...
于 2012-10-11T10:43:51.060 に答える
0
私は手動ループが好きではないので、展開に基づく解決策を次に示します (最初にSRFI 1とSRFI 26をロードします)。
(define (digits n)
(unfold-right zero? (cut modulo <> 10) (cut quotient <> 10) n))
ただし、これは 0 の空のリストを返します。代わりに戻りたい場合は(0)
、特別なケースを追加します。
(define (digits n)
(case n
((0) '(0))
(else (unfold-right zero? (cut modulo <> 10) (cut quotient <> 10) n))))
もちろん、これを他のベースに一般化できます。ここでは、オプションの引数を使用してこれを実装しているため、ベースを指定しない場合、デフォルトは 10 になります。
(define (digits n (base 10))
(case n
((0) '(0))
(else (unfold-right zero? (cut modulo <> base) (cut quotient <> base) n))))
さまざまなスキームの実装では、オプションの引数にさまざまな構文が使用されます。上記は Racket スタイル (および/またはSRFI 89スタイル) の構文を使用します。
于 2012-10-11T20:55:09.473 に答える