2013-03-28 51 views
1

我是新来的斯卡拉并开始了解尾递归。 我了解到,在函数编程尾递归是迭代的在命令性编程的计数器部分(循环):斯卡拉二维尾递推

简单的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) 
} 

问: 什t将会是嵌套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]; 
    } 
} 
+1

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

回答

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

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