私は現在、整数をリストに変換しようとしています。
例えば
1234 => 1、2、3、4で構成されるリスト
私はこれを持っています:
(string->list (number->string 1234))
残念ながら、#と\が追加されます。これは数字の文字列表現だと思います。これらの記号を削除するにはどうすればよいですか。整数を並べ替えて、リストを出力する必要があるので。
上記のコマンドの出力は次のとおりです。
(#\ 1#\ 2#\ 3#\ 4)
私は現在、整数をリストに変換しようとしています。
例えば
1234 => 1、2、3、4で構成されるリスト
私はこれを持っています:
(string->list (number->string 1234))
残念ながら、#と\が追加されます。これは数字の文字列表現だと思います。これらの記号を削除するにはどうすればよいですか。整数を並べ替えて、リストを出力する必要があるので。
上記のコマンドの出力は次のとおりです。
(#\ 1#\ 2#\ 3#\ 4)
これは私が書いた関数で、毎回10で割って数値を分解します:
(define (num->list num)
(if (< num 10)
(list num)
(append (num->list (floor (/ num 10)))
(list (- num (* 10 (floor (/ num 10))))))))
明らかに、これは正の整数でのみ機能しますが、負の整数が必要な場合は簡単に変更できます。
ジョナサンが言ったように、#\ は文字であることを意味します。そのため、文字を数値に変換する必要があります。これを行う簡単な方法を次に示します。
(map (lambda (c) (- (char->integer c) 48))
(string->list (number->string 1234)))
文字列をリストに変換すると、文字のリストが作成されるため、# が取得されます。#\ は区切り文字です。; そのため、リストの操作が完了したら、かなり簡単に文字列に再変換できます。
私はスキームに精通していませんが、コードを多用し、言語に依存しないアプローチは、数学ループを使用して各桁を取得することです。
1234 が x の場合: digit_1 = x%10 digit_2 = x%100 - digit_1 digit_3 = x%1000 - digit_2 - digit_1 など。
x < 1000 の場合は数字 3 の後に停止するように、各駅でチェックを追加する必要があります。言語によっては、さまざまな方法でこれにループを追加できます。
次の点に注意してください。
(floor (/ num 10))
スキームで商手続きを使用するのと同じです:
(quotient num)
その例を次に示します。
Welcome to DrRacket, version 6.1.1 [3m].
Language: Pretty Big; memory limit: 128 MB.
> (floor (/ 235 10))
23
> (quotient 235 10)
23
@Kyle 関数を次のように書き換えることができます。
(define (numberToList number)
(if (< number 10) (list number)
(append (numberToList (quotient number 10))
(list (- number (* 10 (quotient number 10)))))))