2012-02-21 9 views
1

私は計画プログラミングでは新しいです。私はマップの定義、追加などの基本的なアルゴリズムを学んでいます。一次元でM次元リストを変換する

しかし、実装が見つからないアルゴリズムがあります。 M次元のリストを1次元に変換することについて話します。私は自分でそれを定義しようとしましたが、成功しませんでした。私がしたい正確にどのような

'(a b c (d (e)) (g f h)) => '(a b c d e g f h) 

答えて

1

にはいくつかの方法があり、のリストがあります。持っているとして、

(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))) 
+1

これは私のために働く。ありがとうございます! –

2

私は、あなたが検索したい用語が「フラット化」だと思います。これを書く最も簡単な方法は、リストでない場合は、それを含む長さのリストを返します。それがリストの場合は、その要素に対する再帰呼び出しをマッピングした結果にappendを適用します。

+1

** flatten **はRacketの標準ライブラリに組み込まれています:http://docs.racket-lang.org/reference/pairs.html#(def._((ll./racket/list..rkt)._flatten )) – dyoo