2016-10-26 17 views
1

私は2つのセット(リスト)のデカルト積を 'map'関数の助けを借りて返す関数を書こうとしています。返されるリストの要素の各ペアをベクトルにします。スキーム - 'map'を持つデカルト積は?

(cartesian-product '(1 2 3) '(a b)) 

'(#(3 a) #(3 b) #(2 a) #(2 b) #(1 a) #(1 b)) 

私の最初のアイデアは、セット2及び要素にN組の各反復について1つのここ素子Nの変更をベクターアウト要素c(定数)を行う別の手順を作成し、この別個の機能をマップするために進行することでしたセット2とですから、例えば、私は、この別の関数から3つの異なるベクターを得るでしょう(コードサンプルでは)上記のリストを使用している場合:

#'(a 1) #'(a 2) #'(a 3) 

そして、これにマップを使用しているとき、私は結果になるだろう。

'(#'(a 1) #'(a 2) #'(a 3) #'(b 1) #'(b 2) #'(b 3)) 
別の関数を再帰的にする必要があり、それが終わったときに、リストを返すために必要があるため

'((#'(a 1) #'(a 2) #'(a 3)) (#'(b 1) #'(b 2) #'(b 3))) 

しかし、私は、私が代わりに次のようになり、結果になるだろうことに気づきました。

今私は正方形に戻っています。私はアイデアがありません。

cdr,car,cons,map etc 

できるだけ基本として、それを保つようにしてください:ヘルプ... が、これは学校の割り当てであると私はのような単純なものは以外の任意の定義済みの関数を使用することはできませんだということを言及する必要がありますしてください。私はそう私に簡単に行く:)

答えて

2

我々は巣2つのmapのことができますし、正しい場所にvectorを作成することを確認して、最後に結果を平ら月のようにのためのスキームを使用している:

(define (cartesian-product lst1 lst2) 
    (apply append 
     (map (lambda (x) 
       (map (lambda (y) 
         (vector x y)) 
        lst2)) 
       lst1))) 

期待どおりに動作します:

(cartesian-product '(1 2 3) '(a b)) 
=> '(#(1 a) #(1 b) #(2 a) #(2 b) #(3 a) #(3 b)) 
+0

あなたが 'apply' /' append'を使用することを許可されていない場合は、手動でのベクトルの1つのリストにベクトルのリストのリストを結合する必要があります'apply' /' append'行を削除して、私が何を意味するのかを見てください。 –

+1

ありがとうございました!チャームのように働いた! – Schytheron