我一直在尋找一種優雅的方式來編寫一個函數,該函數接受元素列表並返回包含所有可能的不同元素對的元組列表,而不考慮順序,即( a,b)和(b,a)應該被認爲是相同的,只有其中一個被退回。 我相信這是一個非常標準的算法,它可能是來自F#文檔封面的一個例子,但我找不到它,甚至沒有在Internet上搜索SML或Caml。我想出瞭如下:列表中的F#返回元素對
let test = [1;2;3;4;5;6]
let rec pairs l =
seq {
match l with
| h::t ->
yield! t |> Seq.map (fun elem -> (h, elem))
yield! t |> pairs
| _ ->()
}
test |> pairs |> Seq.toList |> printfn "%A"
這工作,並返回預期的結果[(1,2); (1,3); (1,4); (1,5); (1,6); (2,3); (2,4); (2,5); (2,6); (3,4); (3,5); (3,6); (4,5); (4,6); (5,6)]但它看起來非常單一。 我不應該需要經過序列的表達,然後再轉換回一個列表,必須只有兩項基本列表操作或庫調用等效的解決方案...
編輯:
我也有這個在這裏
let test = [1;2;3;4;5;6]
let rec pairs2 l =
let rec p h t =
match t with
| hx::tx -> (h, hx)::p h tx
| _ -> []
match l with
| h::t -> p h t @ pairs2 t
| _ -> []
test |> pairs2 |> Seq.toList |> printfn "%A"
同樣工作,但像第一個似乎不必要地介入和複雜,給予相當容易的問題。我想我的問題是關於風格的,真的,如果有人能爲此提出雙線。
哎呀,人們已經發布sugegstions,而我正在做我的編輯。謝謝你們,你們都這麼快! – 2010-10-03 19:56:38