2016-10-26 83 views
1

我想寫一個函數,返回2集(列表)的笛卡爾乘積的'地圖'功能的幫助,我希望返回列表中的每一對元素都是一個向量。計劃 - 帶有'地圖'的笛卡爾產品?

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

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

我的初始想法是使一個單獨的過程,使一個矢量出元件C(常數)在組2和元件n的組1,其中元素n對於每次迭代變化,然後進行映射此單獨的函數與組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 s,在年底壓平的結果,確保在正確的地方創建一個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',你就會有向量的列表的列表中手動合併爲載體的一個列表,刪除'apply' /'append'行,看看我的意思。 –

+1

謝謝你!像魅力一樣工作! – Schytheron