从数字列表中,任意三个相加为指定值的所有组合
let rec subsets s =
set [ yield s
for e in s do
yield! subsets (Set.remove e s)]
|> Set.toList
subsets (set [1..5])
subsets (set [0;1;2;3;5;7;9;11;4])
subsets (set [0;1;2;3;5;7;9;11])
|> List.filter(fun i -> i.Count = 3)
|> List.map(fun i -> Set.toList i)
|> List.filter(fun i -> List.sum(i) = 12)
下面的这个,不需要进行转换,就更合理了,速度也更快。
let rec subs = function
| [] -> [[]]
| x::xs -> [ for ys in subs xs do
yield! [ys;x::ys] ]
subs [0;1;2;3;5;7;9;11;4]
|> List.filter(fun i -> i.Length = 3)
|> List.filter(fun i -> List.sum(i) = 12)
===============================
| [] -> [[]]
| h::t -> List.fold (fun xs e -> (h::e)::e::xs) [] (powerset t);
powerset [0;1;2;3;5;7;9;11;4]
|> List.filter(fun i -> i.Length = 3)
|> List.filter(fun i -> List.sum(i) = 12)