私は計画プログラミングでは新しいです。私はマップの定義、追加などの基本的なアルゴリズムを学んでいます。一次元でM次元リストを変換する
しかし、実装が見つからないアルゴリズムがあります。 M次元のリストを1次元に変換することについて話します。私は自分でそれを定義しようとしましたが、成功しませんでした。私がしたい正確にどのような
:
'(a b c (d (e)) (g f h)) => '(a b c d e g f h)
私は計画プログラミングでは新しいです。私はマップの定義、追加などの基本的なアルゴリズムを学んでいます。一次元でM次元リストを変換する
しかし、実装が見つからないアルゴリズムがあります。 M次元のリストを1次元に変換することについて話します。私は自分でそれを定義しようとしましたが、成功しませんでした。私がしたい正確にどのような
:
'(a b c (d (e)) (g f h)) => '(a b c d e g f h)
にはいくつかの方法があり、のリストがあります。持っているとして、
(define (flatten lst)
(if (not (list? lst))
(list lst)
(apply append (map flatten lst))))
そして最後に:まず、唯一のプリミティブリストの手順を使用して簡単な解決策:
(define (flatten lst)
(cond ((null? lst)
'())
((not (list? lst))
(list lst))
(else
(append (flatten (car lst))
(flatten (cdr lst))))))
は、この他の解決策はmap
高次の手続きとapply
を(ジョン・クレメンツによって示唆されているように)使用していますコメントで言及され、内蔵のラケットのようないくつかのSchemeの実装で見つかったflatten
手順(それはbiglooで利用できるかどうかはわからない):
(require racket/list)
(flatten '(a b c (d (e)) (g f h)))
私は、あなたが検索したい用語が「フラット化」だと思います。これを書く最も簡単な方法は、リストでない場合は、それを含む長さのリストを返します。それがリストの場合は、その要素に対する再帰呼び出しをマッピングした結果にappendを適用します。
** flatten **はRacketの標準ライブラリに組み込まれています:http://docs.racket-lang.org/reference/pairs.html#(def._((ll./racket/list..rkt)._flatten )) – dyoo
これは私のために働く。ありがとうございます! –