覆盖sml列表中的元素

时间:2013-11-06 18:19:48

标签: ocaml sml smlnj

我已经宣布了下面的函数,希望如果我要覆盖列表中的某些元素它实际上是有效的。但我不完全确定这是否正确。任何与我不同的想法都将受到赞赏< / p>

fun  foo (ls,n) =if ls = nil then nil else ( rev ( 1::List.rev ( List.take (ls,n-1 ))))@(List.drop (ls,n)

它应该像这样工作

foo ([0,3,9],2) = [0,1,9]

2 个答案:

答案 0 :(得分:2)

(此代码的右括号太少。)

我没有看到这种方法有任何大问题,特别是如果你想避免编写自己的显式递归解决方案。如果您将新值添加到第二部分的开头而不是第一部分的结尾,我认为您不需要进行相当多的反转。如果你编写自己的函数,你可以避免一些重复的工作。您可能需要查看List.revAppend,它适用于此类情况。

作为旁注:列表不是随机位置更新的特别好的数据结构。

答案 1 :(得分:0)

你在那里做了很多不必要的工作。 takedroprev@都涉及遍历列表 - 当您只需要执行一次时,您最终会执行此操作五次。正如Jeffrey所指出的那样,只需将rev附加到1的结果即可消除drop来电,但仍有改进的余地。

您应该尝试编写自己的递归函数,该函数不依赖于List库中的任何内容。你需要开发一种直观的递归思维方法,以便随时随地进行函数式编程。调用序列应如下所示:

  foo ([a,b,c,d], 4)
= a :: foo([b,c,d], 3)
= a :: b :: foo([c,d], 2) ...