【问题标题】:Returning the position in a list (ML)返回列表中的位置 (ML)
【发布时间】:2013-09-24 14:57:35
【问题描述】:

定义一个函数,给定一个列表 L、一个对象 x 和一个正数 整数 k,如果 x,则返回 x 在 L 中的第 k 次出现的位置 在 L 中至少出现 k 次,否则为 0。例如,如果 L 是 [#"a",#"b",#"c",#"b"],x为#"b",k为2,则函数 返回 4。

对于这个问题,我不能使用任何辅助函数,也不能使用长度函数。关于我将如何解决它的任何想法?

【问题讨论】:

  • 通过编写一个函数来练习,该函数返回第一次出现的位置(如果有的话)。然后扩展这个想法。

标签: functional-programming sml smlnj


【解决方案1】:

假设find 是您必须实现的功能。从描述中可以直接看出两件事:

  • find 返回一个整数
  • find 至少接受三个参数(Lxk

此外,列表上的函数通常区分两种情况:给定列表为空 ([]) 或包含至少一个元素 (y::ys)。因此我们可以为find使用以下骨架

fun find   []    x k = ...
  | find (y::ys) x k = ...

您应该首先考虑在这两种情况下该怎么做。如果L 为空,则其中肯定没有出现x,因此结果为0。否则,L 由一个头元素y 和剩余的列表ys 组成。如果x等于y,我们只是找到了x的出现,否则我们必须继续在ys中搜索。据此,骨架可以细化为

fun find   []    x k = 0
  | find (y::ys) x k =
      if x = y then ...
      else find ys x k

此时唯一剩下的部分是L 不为空且x = y。但是由于我们对xk-th 出现感兴趣,我们必须检查是否找到它。这可以通过减少k 来完成,每次我们发现x 的出现,最后,当我们找到一个出现并且k 同时是1 时,我们找到了所需的k-th 出现x.

fun find   []    x k = 0
  | find (y::ys) x k =
       if x = y andalso k > 1 then find ys x (k - 1)
       else if x = y then ...
       else find ys x k

剩下的情况是我们发现k-th 出现x。所以我们应该返回这个事件的索引i。但是我们应该从哪里得到i?在某种程度上,我们必须在我们的函数中计算它。如何做到这一点,你自己去了解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多