【发布时间】:2017-08-05 17:24:16
【问题描述】:
如何使用内置的高阶函数或尾递归将以下循环(模式)重写为 Scala?
这是迭代模式的示例,您可以在其中对两个列表元素进行计算(例如比较),但前提是第二个元素在原始输入中的第一个元素之后。注意这里使用了+1步,但一般情况下可以是+n。
public List<U> mapNext(List<T> list) {
List<U> results = new ArrayList();
for (i = 0; i < list.size - 1; i++) {
for (j = i + 1; j < list.size; j++) {
results.add(doSomething(list[i], list[j]))
}
}
return results;
}
到目前为止,我已经在 Scala 中提出了这个:
def mapNext[T, U](list: List[T])(f: (T, T) => U): List[U] = {
@scala.annotation.tailrec
def loop(ix: List[T], jx: List[T], res: List[U]): List[U] = (ix, jx) match {
case (_ :: _ :: is, Nil) => loop(ix, ix.tail, res)
case (i :: _ :: is, j :: Nil) => loop(ix.tail, Nil, f(i, j) :: res)
case (i :: _ :: is, j :: js) => loop(ix, js, f(i, j) :: res)
case _ => res
}
loop(list, Nil, Nil).reverse
}
编辑: 对于所有贡献者,我只希望我能接受每个答案作为解决方案:)
【问题讨论】:
-
然后呢?有什么问题?
-
它看起来有点笨拙,有点不对劲,我想知道是否有更好、更简洁的方法。
-
使用提供的
.map或.foldLeft,改进模式匹配(但这取决于你更好理解的情况)
标签: scala loops functional-programming tail-recursion declarative