scala中的特别函数递归地连接两个列表:不使用“concat”

Posted

技术标签:

【中文标题】scala中的特别函数递归地连接两个列表:不使用“concat”【英文标题】:Ad hoc function in scala to concatenate two lists recursively: No use of "concat" 【发布时间】:2021-12-05 20:15:53 【问题描述】:

我想在 Scala 中有一个函数,它可以连接两个列表,而不使用用于该目的的内置函数。它应该以函数递归的方式编写,但我不知道从哪里开始。

def concatList(lleft: List[String], lright: List[String]): List[String] 

  

【问题讨论】:

从你的函数签名开始。 Discord 服务器是提出这个问题的更好地方。 @Usr654789 discord.gg/Eswfshby users.scala-lang.org/t/… @Usr654789 太好了,这听起来像是递归方法的好方法。只需用代码编写即可:) @Usr654789 docs.scala-lang.org/tour/pattern-matching.html 【参考方案1】:

希望您现在解决了作业问题。对于将来遇到此问题的任何人,您可以像这样使用尾递归

def concatList(lleft: List[String], lright: List[String]): List[String] = lright match 
  case Nil => lleft  // base condition
  case head :: tail =>  // add first element to end of lleft and recurse
    concatList(lleft :+ head, tail)

【讨论】:

为什么是第三种情况? @DmytroMitin 边缘情况,如果用户将 null 传递给第二个参数。否则会产生讨厌的MatchError 如果你开始处理空值,当lleftnulllrighthead :: tail 时会怎样? NPE 并不比 MatchError 好。我想如果空值是可能的,那么最好有Option[List[String]] 并用Option.apply(..) 处理这个问题。 我昨晚在一些 Discord 频道上这样做了,他们建议使用 ::: ,它仍然更快,但没有第三种情况 @DmytroMitin 我删除了它。

以上是关于scala中的特别函数递归地连接两个列表:不使用“concat”的主要内容,如果未能解决你的问题,请参考以下文章

在 scala 中递归构建列表的挑战

递归比较两个列表

Scala的柯里化和函数的部分施用

Scala中的方法与函数

如何在 Scala 中使用 Stream.cons 编写不泄漏的尾递归函数?

Scala中的列表可以添加元素吗?