2014-01-06 123 views
0

我想改變以下函數(或創建一個全新的函數),以便它返回(選擇,而不是選擇)而不是隻(選擇):列表組合(選擇k)返回元組(選擇,而不是選擇)而不是僅僅(選擇)

let rec comb n l = 
    match n, l with 
    | 0, _ -> [[]] 
    | _, [] -> [] 
    | k, (x::xs) -> List.map ((@) [x]) (comb (k-1) xs) @ comb k xs 

目前,

comb 2 ["R";"G";"B"] 

回報

[["R"; "G"]; ["R"; "B"]; ["G"; "B"]] 

我想它返回

[(["R"; "G"], ["B"]); (["R"; "B"], ["G"]); (["G"; "B"], ["R"])] 

我的大部分問題是我對當前函數最後一行的內容缺乏瞭解。

+1

['List.partition'(http://msdn.microsoft.com/en-us/library/ee353782.aspx)? – ildjarn

回答

2

應該是這個樣子:

let rec comb n l = 
    match n, l with 
    | 0, l -> [[],l] 
    | _, [] -> [] 
    | k, (x::xs) -> 
     [for (yes,no) in comb (k-1) xs do 
      yield x::yes,no 
     for (yes,no) in comb k xs do 
      yield yes,x::no] 
相關問題