scala中的二维尾递归

时间:2013-03-28 15:44:13

标签: scala functional-programming tail-recursion

我是 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];
    }
}

2 个答案:

答案 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
    }
  }
}

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