【发布时间】:2021-12-01 21:47:31
【问题描述】:
我必须对列表列表进行投影,该列表返回每个列表中每个元素的所有组合。例如:
projection([[1]; [2; 3]]) = [[1; 2]; [1; 3]].
projection([[1]; [2; 3]; [4; 5]]) = [[1; 2; 4]; [1; 2; 5]; [1; 3; 4]; [1; 3; 5]].
我想出了一个函数:
let projection lss0 =
let rec projectionUtil lss accs =
match lss with
| [] -> accs
| ls::lss' -> projectionUtil lss' (List.fold (fun accs' l ->
accs' @ List.map (fun acc -> acc @ [l]) accs)
[] ls)
match lss0 with
| [] -> []
| ls::lss' ->
projectionUtil lss' (List.map (fun l -> [l]) ls)
和一个测试用例:
#time "on";;
let N = 10
let fss0 = List.init N (fun i -> List.init (i+1) (fun j -> j+i*i+i));;
let fss1 = projection fss0;;
这个功能现在很慢,N = 10需要10多秒才能完成。此外,我认为解决方案是不自然的,因为我必须以两种不同的方式分解同一个列表。 有什么建议可以提高函数的性能和可读性吗?
【问题讨论】:
-
基本上,F# cross product 和 F# cartesian 的任何热门搜索结果...
-
为了比较,这是我的笛卡尔积的 Scheme 版本:stackoverflow.com/questions/5546552/…
-
您所描述的称为列表的笛卡尔积。见stackoverflow.com/questions/3334429/…
标签: performance list f#