F#中最优雅的元素组合

The*_*ost 9 f# combinations functional-programming list simplify

关于F#中元素组合的最优雅和简单实现的另一个问题.

它应该返回输入元素的所有组合(列表或序列).第一个参数是组合中的元素数量.

例如:

comb 2 [1;2;2;3];;
[[1;2]; [1;2]; [1;3]; [2;2]; [2;3]; [2;3]]
Run Code Online (Sandbox Code Playgroud)

The*_*ost 10

比ssp更简洁,更快速的解决方案:

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


kvb*_*kvb 6

let rec comb n l =
  match (n,l) with
  | (0,_) -> [[]]
  | (_,[]) -> []
  | (n,x::xs) ->
      let useX = List.map (fun l -> x::l) (comb (n-1) xs)
      let noX = comb n xs
      useX @ noX
Run Code Online (Sandbox Code Playgroud)