2011-12-12 102 views
2

我看到至少有兩種不同的實現:添加流在斯卡拉

def add_streams(s1:Stream[Int], s2:Stream[Int]): Stream[Int] = 
    Stream.cons(s1.head + s2.head, add_stream(s1.tail, s2.tail))
def add_streams(s1:Stream[Int], s2:Stream[Int]) = 
    (s1 zip s2) map {case (x,y) => x + y}

我想最後一個是更有效,因爲它是不是遞歸。
它是正確的嗎?你將如何編寫這樣的功能?

回答

5

第一個版本被打破,因爲它不檢查Stream的結尾。 (這些流不需要具有不同的長度。)鑑於此,zip版本是更喜歡的版本。

2

首先:當任何一個流是有限的時候,你的實現有不同的行爲。第一個將會以NoSuchElementException的速度崩潰,而第二個會截斷更長的流。

我發現後者更富有表現力和優雅,不管怎樣,儘管我懷疑性能差異在大多數情況下會顯着。