删除列表的第i个元素

时间:2018-11-14 03:06:12

标签: sml smlnj ml

编写一个删除列表中第 i 个元素的函数。如果列表的长度小于 i ,则返回列表。

这是想要的输出:

- deleteIth([1,2,3,4,5,6],3);
val it = [1,2,4,5,6] : int list

- deleteIth([1,2,3,4,5,6],7);
val it = [1,2,3,4,5,6] : int list

这是我的代码:

fun deleteIth (L, i) =
    let
        (* Deletes the element of a list at ith index *)
        fun delete (nil, i, position) = nil
        | delete (x::xs, i, position) = if i = position then xs else 

x :: delete (xs, i, position + 1)
        in
            if i >= 0 andalso i < length L then delete (L, i, 0) else L
        end;

注意:x :: delete(xs,I,position + 1)行应该在上一行的else之后,换行使我以这种方式显示代码。抱歉

但是我的代码放了

 - deleteIth([1,2,3,4,5,6],3);
    val it = [1,2,3,5,6] : int list

 - deleteIth([1,2,3,4,5,6],7);
    val it = [1,2,3,4,5,6] : int list

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于您已经获得了预期的结果,所以这是一个较短的版本,它仅遍历列表一次,并且永远不会超出要删除的元素。
length必须遍历整个列表才能确定其长度。这可能是最不实用的列表功能。)

一般情况下,k> 1并且列表不为空:

  • 要删除第k个元素,请从列表的末尾删除元素k-1,然后将原始列表的开头添加到结果中。

基本案例:

  • 从列表中删除元素1会产生列表的结尾。
  • 从空列表中删除任何内容都会产生空列表。

列表短于k的情况将在到达空列表时终止。

赞:

fun delete_ith ([], k) = []
  | delete_ith (x::xs, 1) = xs
  | delete_ith (x::xs, k) = x :: delete_ith (xs, k - 1)