数字 (数字) のリストを取得し、それらの数字を切り捨てて、Scheme で 1 つの大きな数字 (加算ではない) にする方法があるかどうか疑問に思っていました。たとえば、私はしたいです
(foo '(1 2 3 4))
;=> 1234
これを行うための機能がSchemeに組み込まれていますか?
数字 (数字) のリストを取得し、それらの数字を切り捨てて、Scheme で 1 つの大きな数字 (加算ではない) にする方法があるかどうか疑問に思っていました。たとえば、私はしたいです
(foo '(1 2 3 4))
;=> 1234
これを行うための機能がSchemeに組み込まれていますか?
Scheme ファミリーには多くの言語があり、Scheme にもいくつかのバージョンがあります。たとえば、Racket のように、左連想折り畳み (他のバリエーションもありますが、foldl
、fold
、またはと呼ばれることが多い) を含むものを使用している場合、これは折り畳みに関して非常に簡単に実装できます。reduce
折り目については、次の質問と回答で詳しく説明しています。
fold
この質問には、を反復構造と見なす方法の説明が含まれています(また、Scheme では、末尾呼び出しの最適化を義務付け、反復コードにコンパイルされます)。また、の実装も含まれています。foldl
それを持っていないスキームの場合。reduce
が、Scheme ライブラリの一部で提供されているものよりもいくらか便利なインターフェイスを提供する方法についてのコメント。コードは次のようになりますfoldl
。
(define (list->num digits)
(foldl (lambda (digit n)
(+ (* 10 n) digit))
0
digits))
> (list->num '(1 2 3 4))
1234
あなたの言語にそれがないfoldl
場合は、非常に簡単に記述でき (たとえば、上記の質問の 1 つに対する私の回答には実装が含まれています)、上記のコードを使用するか、関数全体を (同じアプローチを使用して) 自分で記述することができます。 :
(define (list->num-helper digits number-so-far)
(if (null? digits)
number-so-far
(list->num-helper (cdr digits)
(+ (* 10 number-so-far)
(car digits)))))
(define (list->num digits)
(list->num-helper digits 0))
名前付きを使用して、もう少し簡潔にすることができますlet
:
(define (list->num digits)
(let l->n ((digits digits)
(number 0))
(if (null? digits)
number
(l->n (cdr digits)
(+ (* 10 number)
(car digits))))))