Scala

时间:2018-04-21 12:09:08

标签: scala recursion

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

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

它给出错误:

  

错误:(16,23)递归值sumRecursive需要类型       case x :: xs => x + sumRecursive(xs)

我知道递归函数需要声明它们的返回类型。但我不知道如何在这个代码结构中这样做。

3 个答案:

答案 0 :(得分:4)

由于它抱怨缺少显式类型,您可以像指定经典类型(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) }

答案 1 :(得分: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是累加器,将递增以保持总和值

答案 2 :(得分:0)

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

只需键入这样的方法注释即可。

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

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

sunRecursive(list):Int

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

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

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

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

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

所以第3步将return 3+0推进到第二步 它将变为2+3并返回第1步 它将变为1+2+3,即6,它将返回6

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