scala中的二维尾部递归

scala中的二维尾部递归,scala,functional-programming,tail-recursion,Scala,Functional Programming,Tail Recursion,我是Scala的新手,开始学习尾部递归。 我了解到函数式编程中的尾部递归是命令式编程中迭代(对于循环)的一个相反部分: 简单的C++循环到和列表元素: uint32_t sum = 0; for (size_t i = 0; i < list.length(); ++i) { sum += list[i]; } 问题: 什么是嵌套for循环的scala递归等价物 uint32_t sum = 0; for (size_t i = 0; i < list.width(); +

我是Scala的新手,开始学习尾部递归。 我了解到函数式编程中的尾部递归是命令式编程中迭代(对于循环)的一个相反部分:

简单的C++循环到和列表元素:

uint32_t sum = 0;
for (size_t i = 0; i < list.length(); ++i) {
    sum += list[i];
}
问题: 什么是嵌套for循环的scala递归等价物

uint32_t sum = 0;
for (size_t i = 0; i < list.width(); ++i) {
    for (size_t j = j < list.height(); ++j) {
        sum += list[i][j];
    }
}
uint32\u t sum=0;
对于(大小i=0;i
只需编写一个对嵌套列表起作用的相同列表递归方法(
list[list[Int]]
):


只需编写一个对嵌套列表起作用的相同列表递归方法(
list[list[Int]]
):


如果您想要全尾递归,那么应该将所有循环移到参数中。因此(这里没有助手,只是为了简洁):


但是你可能不需要它,除非你的循环很短;每次迭代只需让一个尾部递归函数调用另一个。

如果需要完整的尾部递归,应该将所有循环移到参数中。因此(这里没有助手,只是为了简洁):


但是你可能不需要它,除非你的循环很短;每次迭代只需让一个尾部递归函数调用另一个。

相同,但嵌套除外。就像C++版本一样,除了嵌套。就像C++版本一样。
uint32_t sum = 0;
for (size_t i = 0; i < list.width(); ++i) {
    for (size_t j = j < list.height(); ++j) {
        sum += list[i][j];
    }
}
def listSum2(list: List[List[Int]]): Int = {
  @tailrec def listSumHelper2(list: List[List[Int]], sum: Int): Int = {
    if (list.isEmpty) sum
    else listSumHelper2(list.tail, sum + listSum(list.head))
  }
  listSumHelper2(list, 0)
}
def sumsum(xss: List[List[Int]], current: List[Int] = Nil, sum: Int = 0): Int = {
  current match {
    case x :: more => sumsum(xss, more, sum+x)
    case Nil => xss match {
      case xs :: more => sumsum(more, xs, sum)
      case Nil => sum
    }
  }
}