Как вы спросили в комментарии, как это сделать с помощью Scala 2.13
Stream.unfold
:
Stream.unfold(-1)(i => Some(i+2, i+2))
// immutable.Stream[Int] = Stream(1, <not computed>)
и взглянуть на то, что он на самом деле делает:
Stream.unfold(-1)(i => Some(i+2, i+2)).take(10).toList
// List[Int] = List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
Хотя я бы рекомендовал использовать решение @nader.h
Поскольку мы генерируем бесконечный поток, функция построения будет всегда возвращать только Some
(None
будет означать остановку итерации).
Функция развертывания принимает начальное состояние (здесь -1
) и продолжает обновлять это состояние (правая часть необязательного кортежа (i+2
)), обеспечивая при этом на каждой итерации текущее состояние (левая часть необязательного кортежа) (в данном случае также i+2
))
Другими словами, это начинается с начального состояния -1
, а затем для каждой итерации вы добавляете элемент, основанный на текущем состоянии (для первой итерации это состояние -1
, и вы создаете -1 + 2
- левая часть необязательного кортежа), и вы также изменяете состояние для следующей итерации (для первой итерации это состояние -1
, и вы создаете -1 + 2
как новое состояние - правая часть необязательного кортежа).