【发布时间】:2015-04-13 11:01:08
【问题描述】:
例如,如何合并两个已排序整数的 Streams?我认为这是非常基本的,但发现它一点也不简单。下面的不是尾递归的,当Streams很大时它会堆栈溢出。
def merge(as: Stream[Int], bs: Stream[Int]): Stream[Int] = {
(as, bs) match {
case (Stream.Empty, bss) => bss
case (ass, Stream.Empty) => ass
case (a #:: ass, b #:: bss) =>
if (a < b) a #:: merge(ass, bs)
else b #:: merge(as, bss)
}
}
我们可能想通过引入累加器将其变成尾递归。但是,如果我们预先挂起累加器,我们只会得到一个倒序的流;如果我们用串联 (#:::) 附加累加器,它就不再是惰性(严格)了。
这里有什么解决方案?谢谢
【问题讨论】:
-
"下面的不是尾递归的,当Streams很大时它会堆栈溢出。"为什么?递归不是“真实的”,因为不应该评估“递归”调用中的合并。也就是说,您的代码根本不是递归的,因为它从
if? 的任一分支返回一个新流?还是我误会了?
标签: scala stream lazy-evaluation tail-recursion