1

数字 (数字) のリストを取得し、それらの数字を切り捨てて、Scheme で 1 つの大きな数字 (加算ではない) にする方法があるかどうか疑問に思っていました。たとえば、私はしたいです

(foo '(1 2 3 4))
;=> 1234

これを行うための機能がSchemeに組み込まれていますか?

4

1 に答える 1

3

Scheme ファミリーには多くの言語があり、Scheme にもいくつかのバージョンがあります。たとえば、Racket のように、左連想折り畳み (他のバリエーションもありますが、foldlfold、またはと呼ばれることが多い) を含むものを使用している場合、これは折り畳みに関して非常に簡単に実装できます。reduce折り目については、次の質問と回答で詳しく説明しています。

  • Finding maximum distance between two points between a list (scheme)foldこの質問には、を反復構造と見なす方法の説明が含まれています(また、Scheme では、末尾呼び出しの最適化を義務付け、反復コードにコンパイルされます)。また、の実装も含まれています。foldlそれを持っていないスキームの場合。
  • リストのリストを平坦化するこの質問は、やや変わった折り畳みと、それ (または標準の折り畳み) を使用してリストを平坦化する方法に関するものです。
  • スキーム構造とリストこの質問には、フォールドに渡す関数を調整して、わずかに異なる動作を実現する方法の例があります。(また、私は独断的な (しかし本当です;) コメントを含めます) Common Lispreduceが、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))))))
于 2013-10-23T23:41:05.667 に答える