學習軌道
/
Elixir
Elixir
/
練習
/
盧卡斯數列
盧卡斯數列

盧卡斯數列

學習練習

簡介

串流

Enum模組裡的所有函式都是積極的。當你對可列舉的資料執行多個操作時,每個操作都會產生一個中間結果。

Stream模組是惰性的替代方案,用來取代積極的Enum模組。它提供許多與Enum相同的函式,但不會產生中間結果,而是建立一連串的運算,這些運算要等到串流被傳入Enum模組的函式時才會執行。

串流實作了*Enumerable 協定*且可以組合,你可以把它們串接起來,建立更複雜的功能。

說明

你是 Numberphile Youtube 頻道 的忠實粉絲,剛剛看到了一部關於_盧卡斯數列_的精彩影片。你想用 Elixir 來建立這個數列。

設計函式時,你想運用_惰性求值_,這樣就能產生任意多個數字,但只在需要時才產生,於是你決定使用串流。

1. 攔截錯誤的引數

新增一個防護子句,當用來產生數列的不是整數,或是小於 1 的整數時就拋出錯誤。把這一步放在最前面,可以避免後續步驟出現無限遞迴的錯誤。

LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1

2. 產生基本情況

你知道這個數列有兩個起始數字,它們不遵循相同的規則。撰寫兩個基本情況子句來回傳這些數字:

LucasNumbers.generate(1)
# => [2]

LucasNumbers.generate(2)
# => [2, 1]

3. 建立一般化情況

對於任何長度超過 2 的數列,你知道要把前兩個數字相加才能得到下一個數字,依此類推。撰寫一般化情況吧。

LucasNumbers.generate(3)
# => [2, 1, 3]

LucasNumbers.generate(4)
# => [2, 1, 3, 4]
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Elixir Exercism

準備好開始 盧卡斯數列 了嗎?

註冊 Exercism,透過 58 個概念168 個練習 和真人引導來學習並精通 Elixir,全部免費。