0

定义一个函数,给定一个列表 L、一个对象 x 和一个正整数 k,返回 L 的副本,其中 x 插入第 k 个位置。例如,如果 L 为 [a1, a2, a3] 且 k=2,则返回 [a1, x, a2, a3]。如果 L 的长度小于 k,则在末尾插入。对于这类问题,你不应该使用,例如,长度函数。想想函数如何计算长度。没有“if-then-else”或任何辅助功能。

我已经想出了如何制作一个函数来查找列表的长度

fun mylength ([]) = 0
| mylength (x::xs) = 1+ mylength(xs)

但是,正如问题所述,我不能将其用作插入功能中的辅助功能。另外,我不知道如何使用插入功能?任何帮助或指导将不胜感激!

4

2 回答 2

1

这就是我的处理方式。以下假设列表项从零开始。

fun mylength (lst,obj,pos) =
    case (lst,obj,pos) of
        ([],ob,po)=>[ob]
          | (xs::ys,ob,0) => ob::lst
          | (xs::ys,ob,po) => xs::mylength(ys,obj,pos-1)
于 2013-09-13T21:59:23.977 回答
1

这是如何做到这一点的。您传递给列表尾部函数的每个递归调用和 (k - 1) - 列表尾部中新元素的位置。当列表为空时,您构建一个单元素列表(给您);当 k 为 0 时,您将元素附加到列表的剩余部分。在返回的路上,您附加了之前解包的列表的所有标题。

fun kinsert [] x k = [x]
  | kinsert ls x 0 = x::ls
  | kinsert (l::ls) x k = l::(kinsert ls x (k - 1))

我使用了一个 0 索引列表;如果你想要 1-indexed,只需将 0 替换为 1。

如您所见,它与您的mylength功能几乎相同。不同之处在于递归有两种基本情况,而您在返回途中的操作不是+,而是::

编辑

你可以这样称呼它

kinsert [1,2,3,4,5,6] 10 3;

它有 3 个参数;与您的长度函数不同,它不会将参数包装在元组中。

于 2013-09-13T22:04:59.193 回答