私はスキームプログラミングの初心者で、マップの定義方法、追加方法などの基本的なアルゴリズムを学んでいます。
しかし、実装が見つからないアルゴリズムがあります。M 次元のリストを 1 次元に変換することについて話します。私はそれを自分で定義しようとしましたが、成功しませんでした。
まさに私が欲しいもの:
'(a b c (d (e)) (g f h)) => '(a b c d e g f h)
あなたが検索したい用語は「Flatten」だと思います。これを記述する最も簡単な方法は次のとおりです。リストでない場合は、それを含む長さ 1 のリストを返します。リストの場合は、その要素に再帰呼び出しをマッピングした結果に追加を適用します。
リストを平坦化するには、いくつかの方法があります。まず、プリミティブ リスト プロシージャのみを使用した簡単なソリューション:
(define (flatten lst)
(cond ((null? lst)
'())
((not (list? lst))
(list lst))
(else
(append (flatten (car lst))
(flatten (cdr lst))))))
この他の解決策は、map
高次の手順を使用し、 apply
(John Clements によって提案されたように):
(define (flatten lst)
(if (not (list? lst))
(list lst)
(apply append (map flatten lst))))
最後に、コメントで言及されているように、flatten
Racket などの一部の Scheme 実装に組み込まれているプロシージャ (bigloo で利用できるかどうかはわかりません):
(require racket/list)
(flatten '(a b c (d (e)) (g f h)))