【问题标题】:Penultimate match making cases倒数第二个配对案例
【发布时间】:2020-05-17 22:36:54
【问题描述】:
def penultimate(l:List[Int]):Int = l match{
    case x::y::Nil => x
    case x::tail => penultimate(tail)
    case _ => ???
}

倒数第二个是列表中最后一个元素之前的元素。

在第一种情况下,我们有一个包含 2 个元素的列表。哪个是基本情况?

第二种情况,我们将递归调用链表尾部的相同方法。每次递归调用,列表中的元素数量都会减少。

最后一种情况到底是什么?第三种情况何时会发生?

【问题讨论】:

  • 对,就是空列表,只能抛出异常。
  • 空列表或只有一个元素的列表的倒数第二个是多少?确实没有,所以您要么抛出异常,要么不重新调整 Int,而是返回一个 Option[Int]
  • 所以最好替换 case _ => ???按大小写 _ => Option[Int] ?
  • @user90379 这取决于您认为最佳实践,但在函数式编程中,是的,这个想法不是抛出异常。所以最终的代码就像this

标签: list scala recursion pattern-matching


【解决方案1】:

如果初始列表的元素少于 2 个,则会发生最后一种情况。

【讨论】:

    【解决方案2】:

    因此,就像您自己解释的那样,如果列表中有两个元素,则第一种情况匹配。

    否则,如果有一个或多个,是第二种情况?

    还剩下什么?最后一个案例匹配空列表。如果没有第一个元素要砍掉,它将穿过第二个案例,并击中最后一个。如果您愿意,可以将??? 留在那里或抛出其他异常。或者只是做l.head(它会为你抛出)。

    我想,你写这个函数只是为了锻炼,但我还是想提一下:你正在做的相当于l.init.last

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2018-11-02
      • 2021-07-10
      • 2021-04-01
      • 2020-07-21
      • 1970-01-01
      相关资源
      最近更新 更多