我已经被困在这几个小时了 - 想知道是否有人可以帮助我。
我有两个不同长度的列表,我想用0填充较短的列表,以便两个列表具有相同的长度。
我想使用Folding函数执行此操作,而不使用递归。
任何提示都非常感谢!
答案 0 :(得分:4)
这听起来像是一个家庭作业问题(部分原因是对允许的解决方案有些任意限制)。因此,为您编写代码并没有什么帮助 - 它消除了完成家庭作业的重点。但是,您没有提供足够的信息来帮助其他任何方式。如果您展示了在问题花费的时间内编写的最佳代码,那么帮助会更容易,并解释了为什么您认为它不起作用。然后人们可以告诉你代码可能有什么问题,并给出具体的提示。
“折叠功能”的含义并不完全清楚。您不能同时使用List.fold_left2
或List.fold_right2
折叠两个列表,因为这些假设输入列表的长度已经相同。这留下了List.fold_left
和List.fold_right
(在我看来)。
如果您允许进行初始传递以获取两个列表的长度,则可以折叠较短的列表以制作最后添加了填充的副本。 (右侧折叠最简单,但对于很长的列表,它不能很好地工作。)
这种方法的一个问题是你必须单独进行填充,这可能需要递归(主要是由于OCaml库IMHO的限制)。另一种方法是在遍历和复制较短的列表时折叠较长的列表。较长的列表将作为一个度量,告诉您一旦较短的列表耗尽,将添加多少填充。这会复杂得多。
如果任何一种方法看起来值得一看,您可以从编写一个仅使用List.fold_right
复制列表的函数开始。这非常接近你想要做的事情(在我看来)。
答案 1 :(得分:-2)
查找列表本身的长度是递归的。无论如何,这是我解决问题的方法。我在SML的List结构中使用了tabulate函数。另外,我假设你熟悉匿名函数。
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