OCaml:使用折叠填充零的填充列表

时间:2013-09-16 21:57:01

标签: list functional-programming ocaml folding

我已经被困在这几个小时了 - 想知道是否有人可以帮助我。

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

我想使用Folding函数执行此操作,而不使用递归。

任何提示都非常感谢!

2 个答案:

答案 0 :(得分:4)

这听起来像是一个家庭作业问题(部分原因是对允许的解决方案有些任意限制)。因此,为您编写代码并没有什么帮助 - 它消除了完成家庭作业的重点。但是,您没有提供足够的信息来帮助其他任何方式。如果您展示了在问题花费的时间内编写的最佳代码,那么帮助会更容易,并解释了为什么您认为它不起作用。然后人们可以告诉你代码可能有什么问题,并给出具体的提示。

“折叠功能”的含义并不完全清楚。您不能同时使用List.fold_left2List.fold_right2折叠两个列表,因为这些假设输入列表的长度已经相同。这留下了List.fold_leftList.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