stream 流 是遞迴的資料結構,包含乙個表頭(當前元素)和乙個表尾(集合的其餘部分)。可以利用乙個函式和函式的遞迴呼叫來構建流。
stream.cons(head,tail) head是stream中的表頭,tail是餘下的元素
例子:給定乙個整數值,建立乙個連續遞增的整數集合
scala> def inc(i:int):stream[int] = stream.cons(i,inc(i+1))
scala> inc(1).take(5).tolist
res0: list[int] = list(1,2,3,4,5)
建立斐波那契數列
scala> def fabonaccistream(last:int,now:int):stream[int] = stream.cons(now,fabonaccistream(now,last+now))
scala> fabonaccistream(0,1).take(20).tolist
res1: list(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765)
思路:stream中只能夠取到頭元素,但是斐波那契需要最末端的兩個元素
所以遞迴的函式需要傳入最末端的兩個元素,計算並放入stream的末尾
fabonaccistream(0,1).take(5) 的計算過程:
stream.cons( 1, fabinaccistream( 1, 0+1 => 1)) //list(1)
stream.cons( 1, stream.cons( 1, fabinaccistream( 1, 1+1 => 2))) //list(1,1)
stream.cons( 1, stream.cons( 1, stream.cons( 2, fabinaccistream( 2, 1+2=>3)))) //list(1,1,2)
stream.cons( 1, stream.cons( 1, stream.cons( 2, stream.cons(3, fabinaccistream( 3, 2+3 => 5))))) //list(1,1,2,3)
stream.cons( 1, stream.cons( 1, stream.cons( 2, stream.cons(3, stream,cons( 5, fabinaccistream( 5, 3+5 =>8)))))) //list(1,1,2,3,5)
還看到另一種很有趣的斐波那契數列建立方法
scala> lazy val fib: stream[bigint] = stream.cons(1, stream.cons(1, (fib zip fib.tail).map(p => p._1 + p._2)))
scala的zip操作
zip: zip[b](that: geniterable[b]): list[(a, b)] 與另外乙個列表進行拉鍊操作,將對應位置的元素組成乙個pair,返回的列表長度為兩個列表中短的那個
scala> val list = list(1,2,3,4,5)
scala> list zip list.tail
res2: list[(int,int)] = list((1,2),(2,3),(3,4),(4,5))
參考文章
scala中stream的應用場景及其實現原理
scala的stream
scala 強大的集合資料操作示例
Stream流實現斐波那契數列
我們都知道斐波那契數列有很多種實現方法,在jdk1.8以前沒有流操作,只能通過遞迴或者迭代等其他方式來實現斐波那契數列,但是jdk1.8以後,有了流操作,我們就可以使用流來實現斐波那契數列.stream.iterate new int i new int limit 10 foreach i sys...
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
迴圈斐波那契數列 斐波那契數列應用
什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...