我是 Scala 的新手,并开始了解尾递归。 我了解到函数式编程中的尾递归是命令式编程中迭代(for循环)的反向部分:
汇总列表元素的简单C ++循环:
uint32_t sum = 0;
for (size_t i = 0; i < list.length(); ++i) {
sum += list[i];
}
Scala递归等价物:
def listSum(list: List[Int]): Int = {
def listSumHelper(list: List[Int], sum: Int): Int = {
if (list.isEmpty) sum
else listSumHelper(list.tail, sum + list.head)
}
listSumHelper(list, 0)
}
问题: 什么是scala递归等价的嵌套for循环?
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];
}
}
答案 0 :(得分:2)
只需编写一个相同的列表递归方法,该方法适用于嵌套列表(List[List[Int]]
):
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)
}
答案 1 :(得分:2)
如果想要完整的尾递归,则应将所有循环移动到参数中。所以(这里没有帮手,只是为了简洁):
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
}
}
}
但你可能不需要它,除非你的循环真的很短;只需要一个尾递归函数,每次迭代调用另一个。