我正在用 Scala 解决荷兰国旗问题,并提出以下代码:
def dutchNationalFlag[T](a: Array[T])(implicit ordering: Ordering[T]) = {
def sort(lo: Int, hi: Int): Unit = {
Stream.iterate((lo, hi, lo + 1)) { acc =>
val (lt, gt, i) = acc
if (ordering.lt(a(i), a(lt))) {
swap(lt, i, a)
(lt + 1, gt, i + 1)
} else if (ordering.gt(a(i), a(gt))) {
swap(gt, i, a)
(lt, gt - 1, i)
} else {
(lt, gt, i + 1)
}
}
.takeWhile(acc => acc._2 >= acc._3)
.lastOption
.foreach { acc =>
val (lt, gt, _) = acc
sort(lo, lt - 1)
sort(gt + 1, hi)
}
}
sort(0, a.length - 1)
}
出于性能原因,我想修改现有数组,而不是创建一个新数组。swap
上面的代码可以工作,但是在调用 from时有明显的副作用iterate
,这在纯函数式代码中是有问题的。我考虑用swap
稍后执行的方法引用替换foreach
,类似于 Haskell IO,但正如您可以想象的那样,这样做会使代码有些复杂。
其他想法?