2012-02-16 11 views
2

リストを取り、引数の順列のリストを返す関数を書いています。リストの順列を生成する

私は要素を削除し、その関数を再帰的に使用してすべての順列を生成する関数を使用してその方法を知っています。

(insert-everywhere 1 '(a b)) 

を取得します:

(define (insert-everywhere item lst) 
    (define (helper item L1 L2) 
    (if (null? L2) (cons (append L1 (cons item '())) '()) 
     (cons (append L1 (cons item L2)) 
       (helper item (append L1 (cons (car L2) '())) (cdr L2))))) 
    (helper item '() lst)) 

この関数は次のように、リストのすべての可能な場所にアイテムを挿入します:私は今、私は次の関数を使用したい問題を抱えている

'((1 a b) (a 1 b) (a b 1)) 

リストのすべての順列を得るにはどうすればよいですか?

私が今持っている:

(define (permutations lst) 
    (if (null? lst) 
     '() 
     (insert-helper (car lst) (permutations (cdr lst))))) 

(define (insert-helper item lst) 
    (cond ((null? lst) '()) 
     (else (append (insert-everywhere item (car lst)) 
        (insert-helper item (cdr lst)))))) 

をしかし(permutations '(1 2 3))を行うことは、単に空のリスト'()を返します。各回答は、それ以前に1に関連しているか

(permutations  '()) = ??? 
(permutations  '(z)) = ??? 
(permutations '(y z)) = ??? 
(permutations '(x y z)) = ??? 

図アウト:

答えて

2

まず、関連する例の家族を構築します。つまり、リストの末尾にある前の回答とリストの先頭にある新しい要素を使って、各回答をどのように計算できますか?ここで

+0

は、リストの要素から成っていることを、「サイズ」サイズの数字のすべての順列を生成する関数、私が見るので、各回答はの車です前のリストのすべての順列のすべての場所に挿入された現在のリスト。 これまでのリストのすべての順列にinsert-everywhere関数を適用するにはどうすればよいですか? –

+0

@EricMercerは、補助機能のための良い仕事のように聞こえる。 –

+0

申し訳ありませんが、明確にできますか?私はまだ何をすべきか分からないのですか? –

1

は、「アイテムの

(define (generate-permutations items size) 
    (if (zero? size) 
     '(()) 
     (for/list ([tail (in-list (generate-permutations items (- size 1)))] 
       #:when #t 
       [i (in-list items)] 
       #:unless (member i tail)) 
     (cons i tail)))) 
関連する問題