【问题标题】:Delete the ith element of a list删除列表的第 i 个元素
【发布时间】:2019-04-16 23:19:04
【问题描述】:

编写一个删除列表中第 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

感谢您的帮助。

【问题讨论】:

  • 您不需要辅助函数或length。列表和索引都是您需要的参数。 (提示:倒计时而不是倒计时。)
  • 谢谢,我想出了如何获得我想要的输出。但是如果没有辅助函数,我该怎么做呢。

标签: sml smlnj ml


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多