Scala 通过映射递归

Scala 通过映射递归,scala,recursion,map,Scala,Recursion,Map,我如何通过映射递归 我正在寻找类似列表递归的东西,如下所示 def count(list: List[Int]): Int = { def go(list: List[Int], acc: Int)) = { case x :: xs => go(xs, x + sum) case Nil => sum } go(list, 0) } 请忽略以下事实:fold或reduce。我将这个尾部递归函数作为一个示例来介绍我希望通过映射递归的内容。

我如何通过映射递归

我正在寻找类似列表递归的东西,如下所示

def count(list: List[Int]): Int = { 
   def go(list: List[Int], acc: Int)) = {
      case x :: xs => go(xs, x + sum)
      case Nil => sum
   }
   go(list, 0)
}

请忽略以下事实:
fold
reduce
。我将这个尾部递归函数作为一个示例来介绍我希望通过映射递归的内容。我希望在递归映射时能够附加到
累加器
参数。

您可以使用.toSeq或.toList或类似工具将映射转换为Seq,也可以定义自己的映射提取器,但最简单的方法是直接使用head和tail

def recursive[A, B](map: Map[A, B]): Int = 
  if (map.isEmpty) 0 else helper(map)

def helper[A, B](map: Map[A, B]): Int = (map.head, map.tail) match {
  case ((a, b), xs) if xs.isEmpty => 1
  case ((a, b), xs) => 1 + helper(xs)
}

您可以在地图上调用
.toList
,生成(键、值)对列表,然后在列表中递归。在末尾转换回映射。map.keys()是一个Iterable,因此您可以使用与使用
列表
参数相同的方法来使用它。我建议在映射上调用
.toStream
,因为流是惰性的。这样,您就不需要预先创建一个完整的列表,特别是当您不打算在递归函数中遍历整个列表时。当您想要使用累加器时,fold实际上是非常好的。你能解释一下为什么fold不适合你的用例吗?