Как мне реализовать функцию, которая генерирует натуральные числа 1,3,5,7 ...? - PullRequest
0 голосов
/ 20 июня 2019

Как реализовать функцию, которая генерирует бесконечные нечетные натуральные числа 1,3,5,7 ...?

Моя попытка:

def oddNats: Stream[Int] = {
  def loop(a: Int, b: Int): Stream[Int] =
  cons(a, loop(b, a + 2))
  loop(0, 1)
}

должно быть def oddNats: Stream[Int] = ???.

Ответы [ 2 ]

6 голосов
/ 20 июня 2019

вы можете использовать Stream.from(from: Int, step: Int):

def generate(): Stream[Int] = {
    Stream.from(1, 2)
  }

println(generate().take(10).toList) // this will print List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)

4 голосов
/ 20 июня 2019

Как вы спросили в комментарии, как это сделать с помощью 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 как новое состояние - правая часть необязательного кортежа).

...