【问题标题】:two dimensional tail recursion in scalascala中的二维尾递归
【发布时间】:2013-03-28 15:44:13
【问题描述】:

我是 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)
}  

问题: 嵌套 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];
    }
}

【问题讨论】:

  • 相同,除了嵌套。就像 C++ 版本一样。

标签: scala functional-programming tail-recursion


【解决方案1】:

只需编写一个适用于嵌套列表的相同列表递归方法 (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)
}

【讨论】:

    【解决方案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
        }
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 2018-03-17
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多