Генераторы могут быть рекурсивными?

Я наивно пытался создать рекурсивный генератор. Не работал. Это - то, что я сделал:

def recursive_generator(lis):
    yield lis[0]
    recursive_generator(lis[1:])

for k in recursive_generator([6,3,9,1]):
    print(k)

Все, что я получил, было первым объектом 6.

Существует ли способ заставить такой код работать? По существу передача yield управлять к уровню выше в схеме рекурсии?

58
задан 7 July 2016 в 23:12

1 ответ

Да у Вас могут быть рекурсивные генераторы. Однако они страдают от того же предела глубины рекурсии как другие рекурсивные функции.

def recurse(x):
  yield x
  yield from recurse(x)

for (i, x) in enumerate(recurse(5)):
  print(i, x)

Этот цикл добирается приблизительно до 3 000 (для меня) перед катастрофическим отказом.

Однако с некоторым обманом, можно создать функцию, которая подает генератор к себе. Это позволяет Вам писать генераторы как, они являются рекурсивными, но не: https://gist.github.com/3noch/7969f416d403ba3a54a788b113c204ce

0
ответ дан 1 November 2019 в 13:59

Другие вопросы по тегам:

Похожие вопросы: