Az Enum modul összes függvénye mohó. Amikor az Enum modullal több műveletet végzel el felsorolható adatokon, minden művelet egy köztes eredményt hoz létre.
A Stream modul a mohó Enum modul lusta alternatívája. Sok ugyanolyan függvényt kínál, mint az Enum, de a köztes eredmények létrehozása helyett olyan számítások sorozatát építi fel, amelyek csak akkor hajtódnak végre, amikor a streamet átadod az Enum modul egyik függvényének.
A streamek megvalósítják az Enumerable protokollt, és összeilleszthetők, vagyis egymás után fűzheted őket, hogy összetettebb funkcionalitást hozz létre.
Nagy rajongója vagy a Numberphile Youtube-csatornának, és épp most láttál egy remek videót a Lucas Number Sequence-ről. Ezt a sorozatot szeretnéd Elixirben létrehozni.
A függvényed tervezése közben szeretnéd kihasználni a lusta kiértékelést, hogy annyi számot generálhass, amennyit csak akarsz, de csak akkor, ha tényleg szükséged van rájuk. Ezért úgy döntesz, hogy streamet használsz.
Adj hozzá egy guard klauzulát, amely hibát dob, ha nem egész számmal vagy 1-nél kisebb egésszel próbálod generálni a sorozatot. Ha ezt már az első lépésben megteszed, elkerülöd a végtelen rekurzióból eredő hibákat a későbbi lépésekben.
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
Tudod, hogy a sorozatnak két kezdő száma van, amelyek nem ugyanazt a szabályt követik. Írj két alapeset-klauzulát, amelyek visszaadják ezeket a számokat:
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
Ha a sorozat hosszabb 2-nél, akkor tudod, hogy a következő számhoz az előző kettőt kell összeadnod, és így tovább. Írd meg az általános esetet.
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.