0

我已经坚持了好几个小时了——想知道是否有人可以帮助我。

我有两个不同长度的列表,我想用 0 填充较短的列表,以便两个列表具有相同的长度。

我想使用折叠函数来做到这一点,而不是使用递归。

任何提示都非常感谢!

4

2 回答 2

4

这听起来像是一个家庭作业问题(部分原因是对允许的解决方案有些武断的限制)。因此,仅仅为您编写代码并没有真正的帮助——它消除了做家庭作业的全部意义。但是,您没有提供足够的信息来帮助任何其他方式。如果你展示了你在解决问题的几个小时内编写的最好的代码,并解释了为什么你认为它不起作用,那么帮助会容易得多。然后人们可以告诉你代码可能有什么问题,并给出具体的提示。

您所说的“折叠功能”是什么意思并不完全清楚。您不能同时使用List.fold_left2List.fold_right2折叠两个列表,因为它们假定输入列表的长度已经相同。这会留下List.fold_leftList.fold_right(在我看来)。

如果允许您进行初始传递以获取两个列表的长度,则可以折叠较短的列表以制作副本,并在末尾添加填充。(右折叠是最简单的,尽管它不适用于很长的列表。)

这种方法的一个问题是您必须单独进行填充,这可能需要递归(主要是由于 OCaml 库恕我直言的限制)。另一种方法是在遍历和复制较短的列表时折叠较长的列表。较长的列表将作为一种衡量标准,告诉您在较短的列表用完后要添加多少填充。这将是相当复杂的。

如果任何一种方法看起来都值得一看,您可以先编写一个List.fold_right仅用于复制列表的函数。这与您想要做的非常接近(在我看来)。

于 2013-09-16T22:30:40.620 回答
-2

查找列表本身的长度是递归的。无论如何,这是我解决问题的方法。我使用了 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
于 2013-09-17T00:26:30.847 回答