我正在尝试将递归和函数写为:
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)
我知道递归函数需要声明它们的返回类型。但我不知道如何在这个代码结构中这样做。
答案 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
,
a
是sumRecursive
Int
是List[Int] => Int
5
是list => 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。