我已经坚持了好几个小时了——想知道是否有人可以帮助我。
我有两个不同长度的列表,我想用 0 填充较短的列表,以便两个列表具有相同的长度。
我想使用折叠函数来做到这一点,而不是使用递归。
任何提示都非常感谢!
我已经坚持了好几个小时了——想知道是否有人可以帮助我。
我有两个不同长度的列表,我想用 0 填充较短的列表,以便两个列表具有相同的长度。
我想使用折叠函数来做到这一点,而不是使用递归。
任何提示都非常感谢!
这听起来像是一个家庭作业问题(部分原因是对允许的解决方案有些武断的限制)。因此,仅仅为您编写代码并没有真正的帮助——它消除了做家庭作业的全部意义。但是,您没有提供足够的信息来帮助任何其他方式。如果你展示了你在解决问题的几个小时内编写的最好的代码,并解释了为什么你认为它不起作用,那么帮助会容易得多。然后人们可以告诉你代码可能有什么问题,并给出具体的提示。
您所说的“折叠功能”是什么意思并不完全清楚。您不能同时使用List.fold_left2
或List.fold_right2
折叠两个列表,因为它们假定输入列表的长度已经相同。这会留下List.fold_left
和List.fold_right
(在我看来)。
如果允许您进行初始传递以获取两个列表的长度,则可以折叠较短的列表以制作副本,并在末尾添加填充。(右折叠是最简单的,尽管它不适用于很长的列表。)
这种方法的一个问题是您必须单独进行填充,这可能需要递归(主要是由于 OCaml 库恕我直言的限制)。另一种方法是在遍历和复制较短的列表时折叠较长的列表。较长的列表将作为一种衡量标准,告诉您在较短的列表用完后要添加多少填充。这将是相当复杂的。
如果任何一种方法看起来都值得一看,您可以先编写一个List.fold_right
仅用于复制列表的函数。这与您想要做的非常接近(在我看来)。
查找列表本身的长度是递归的。无论如何,这是我解决问题的方法。我使用了 SML 列表结构中的制表功能。另外,我假设您熟悉匿名函数。
fun put_zeroes lst1 lst2 =
let
val zero_nums = List.length(lst2)-List.length(lst1)
val pad_zeroes = List.tabulate(zero_nums,fn x => 0)
val new_lst1 = lst1@pad_zeroes
in
new_lst1
end