【问题标题】:Recursive function call in ScalaScala中的递归函数调用
【发布时间】:2018-04-21 21:45:42
【问题描述】:

我正在尝试将递归求和函数编写为:

val sumRecursive = (list: List[Int]) => list match {
  case Nil => 0
  case x::xs => x + sumRecursive(xs)
}

报错:

Error:(16, 23) 递归值 sumRecursive 需要类型 案例 x::xs => x + sumRecursive(xs)

我了解递归函数需要声明其返回类型。但我不确定如何在这个代码结构中做到这一点。

【问题讨论】:

  • 也许应该是def sumRecursive(list: List[Int]),名称和参数之间没有= 字符。

标签: scala recursion


【解决方案1】:

由于它抱怨缺少显式类型,您可以像指定经典类型 (val a: Int = 5) 一样提供它:

val sumRecursive: List[Int] => Int =
  list => list match {
    case Nil => 0
    case x::xs => x + sumRecursive(xs)
  }

给出:

scala> sumRecursive(List(1, 2, 3))
res0: Int = 6

val a: Int = 5进行类比,

  • asumRecursive
  • IntList[Int] => Int
  • 5list => list match { case Nil => 0; case x::xs => x + sumRecursive(xs) }

【讨论】:

    【解决方案2】:

    如果你的列表太长,尾递归函数可能会更好。

    val sumRecursive: (List[Int], Int) => Int =
        (list, acc) => list match {
          case Nil => acc
          case x :: xs => sumRecursive(xs, x + acc)
        }
    

    试试这个

    这样称呼它:

    sumRecursive(List(1, 2, 3, 4, 5), 0)
    

    0 是累加器,将递增以保存总和值

    【讨论】:

      【解决方案3】:

      由于它要求类型注释,因此在 Scala 中,递归函数无法推断函数的返回类型。这是我们需要在您的情况下做的事情,它将是 Int。

      只需像这样键入注释方法。

      val sumRecursive :Int= (list: List[Int]) => list match {
      case Nil => 0
      case x::xs => x + sumRecursive(xs)}
      

      我认为你想知道这一点。 假设列表中有 3 个元素:1,2,3

      sunRecursive(list): Int

      它将进入 case x::xs 这意味着 x 是列表的头部,xs 是尾部。

      第一步 所以你做1 + sumRecursive(xs) //xs=2, 3

      第二步2+sumResursive(xs) //xs=3

      第三步3 +sumResursive(xs) //xs=Nil

      它将进入第一种情况并返回0。

      所以第三步将return 3+0到第二步 会变成2+3,回到第一步 它将变为1+2+3,即 6,它将返回 6

      所以返回类型最终将是 Int 。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 2017-07-31
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多