Todas las funciones del módulo Enum son inmediatas. Cuando realizas varias operaciones sobre enumerables con el módulo Enum, cada operación genera un resultado intermedio.
El módulo Stream es una alternativa perezosa al módulo Enum, que es inmediato. Ofrece muchas de las mismas funciones que Enum, pero en lugar de generar resultados intermedios, construye una serie de cálculos que solo se ejecutan cuando el stream se pasa a una función del módulo Enum.
Los streams implementan el protocolo Enumerable y son componibles: puedes encadenarlos para crear funcionalidades más complejas.
Eres un gran admirador del canal de YouTube Numberphile y acabas de ver un video muy interesante sobre la sucesión de números de Lucas. Quieres crear esta sucesión usando Elixir.
Mientras diseñas tu función, quieres hacer uso de la evaluación perezosa, para poder generar tantos números como quieras, pero solo si los necesitas. Así que decides usar un stream.
Agrega una cláusula de guarda para lanzar un error si se usa algo que no es un entero, o un entero menor que 1, para generar la sucesión. Hacer esto como primer paso evitará errores de recursión infinita en los pasos siguientes.
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
Sabes que la sucesión tiene dos números iniciales que no siguen la misma regla. Escribe dos cláusulas de caso base para devolver estos números:
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
Para cualquier sucesión de más de 2 elementos, sabes que debes sumar los dos números anteriores para obtener el siguiente, y así sucesivamente. Escribe el caso generalizado.
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.