这是我的代码,它应该是什么
前缀:'列表 -> '列表列表 prefixes l 返回输入列表 l 的所有非空前缀的列表,按从最短到最长的顺序排列。空列表不存在非空前缀。
powerset: '列表 -> '列表列表 powerset l 返回输入列表 l 中的值集的幂集(集合 A 的幂集定义为集合 A 的所有子集的集合,包括集合本身)。返回的嵌套列表(以及其中的每个列表元素)中的顺序并不重要。
但是,它一直让我断言失败
断言(前缀 [1;2;3;4] = [[1]; [1;2]; [1;2;3]; [1;2;3;4]]); 断言(List.sort cmp(powerset[1;2;3])=List.sort cmp[[1];[1;2];[1;2;3];[1;3];[2]; [2; 3]; [3]]);
我的代码有什么问题?
let prefixes l =
let add_prefix acc x = match acc with
| [] -> [[x]]
| hd :: _ as lst -> (x :: hd) :: lst
in
List.rev (List.fold_left add_prefix [] l);;
let powerset l =
let add_element_to_sets x sets =
let with_x = List.map (fun subset -> x :: subset) sets in
with_x @ sets
in
List.fold_right add_element_to_sets l [[]];;
let cmp x y = if x < y then (-1) else if x = y then 0 else 1 in
assert (prefixes [1;2;3;4] = [[1]; [1;2]; [1;2;3]; [1;2;3;4]]);
assert (prefixes [] = []);
assert (List.sort cmp (powerset [1;2;3]) = List.sort cmp [[1]; [1; 2]; [1; 2; 3]; [1; 3]; [2]; [2; 3]; [3]]);
assert ([] = powerset []);
您的代码没有任何问题。你的测试有问题。
[]
是每个列表的前缀,也是每个集合的子集,因此它应该包含在 prefixes
和 powerset
输出中(可能作为这两种情况下的第一个元素)。