非尾递归组合函数可以这样编写:
let rec combinations l k =
if k <= 0 || k > List.length l then []
else if k = 1 then List.map (fun x -> [x]) l
else
let hd, tl = List.hd l, List.tl l in
combinations tl k |> List.rev_append (List.map (fun x -> hd::x) (combinations tl (k-1)))
请注意,我使用List.rev_append
至少提供了append
的尾递归版本
这意味着如果您想从列表中获取k个元素,则生成所有组合。
我只是想知道是否可能创建一个完全的尾递归版本combinations
?