【问题标题】:Tail Recursive findNextAndTail in ScalaScala中的尾递归findNextAndTail
【发布时间】:2017-09-02 01:05:49
【问题描述】:

如何使findNextAndTail 在尾递归之下?

  def uncons[A](s: Seq[A]): Option[(A, Seq[A])] = for (h <- s.headOption) yield (h, s.tail)

  // This works as-is. How can I make this function tail recursive?
  // @tailrec
  def findNextAndTail[A, B](parseFunction: A => Option[B], s: Seq[A]): Option[(B, Seq[A])] =
    for ((h, tail) <- uncons(s); r <- parseFunction(h) match {
      case Some(b) => Some((b, tail))
      case None => findNextAndTail(parseFunction, tail)
    }) yield r

  // Function for example usage
  def parseInt(s: String): Option[Int] = try {
    Some(Integer.parseInt(s))
  } catch {
    case _ => None
  }

  // Example usage of findNextAndTail
  def main(args: Array[String]): Unit = {
    val l = List("a", "b", "123", "x", "y", "z")
    val r = findNextAndTail(parseInt, l)
    // r=Some((123,List(x, y, z)))
    println(s"r=$r")
  }

【问题讨论】:

    标签: scala recursion tail-recursion


    【解决方案1】:

    试试这个。

    @annotation.tailrec
    def findNextAndTail[A, B](parseFunction: A => Option[B]
                             ,s: Seq[A]): Option[(B, Seq[A])] =
      uncons(s) match {
        case Some((h, tail)) =>
          parseFunction(h) match {
            case Some(b) => Some((b, tail))
            case None => findNextAndTail(parseFunction, tail)
          }
        case _ => None
      }
    

    【讨论】:

      猜你喜欢
      • 2018-03-17
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多