0

我声明了下面的函数,希望如果我要覆盖列表中的某些元素,它确实有效。但我不完全确定这是否是正确的方法。任何与我不同的想法都会受到赞赏

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]
4

2 回答 2

2

(这段代码的右括号太少了。)

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

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

于 2013-11-06T18:34:36.963 回答
0

你在那里做了很多不必要的工作。take, drop,rev并且@都涉及遍历列表 - 你最终会这样做五次,而你只需要这样做一次。正如Jeffrey指出的那样,您rev只需将 附加1到 的结果即可消除调用drop,但仍有改进的余地。

您应该尝试编写自己的递归函数,该函数不依赖于List库中的任何内容。你真的需要培养对递归思维的直观把握,才能在函数式编程中取得任何进展。调用顺序应如下所示:

  foo ([a,b,c,d], 4)
= a :: foo([b,c,d], 3)
= a :: b :: foo([c,d], 2) ...
于 2013-11-07T00:46:32.703 回答