2017-01-16 4 views
-2

У меня есть задача составить список списков, соответствующих определенным правилам. Список должен представлять дерево с корнем и ветвями из этого корня с определенным цветом. Каждая ветвь должна быть представлена ​​в виде списка ее дочерних элементов (одна черная ветвь генерирует 3 белых, 1 белая ветвь - 2 черных). Например: root=['black'], первые ветки [['white','white','white']], следующая итерация должна быть [[[black,black],[black,black],[black,black]]] и так далее.Создайте бесконечный список из списка

Этот бесконечный список должен храниться в глобальной переменной. Является ли это возможным? Мой код, который генерирует такой список, выполняет его только для заданного количества шагов.

root = ['b'] 
def change(root): 
    for index, item in enumerate(root): 
     if isinstance(item, list): 
      change(item) 
     elif item == 'b': 
      root[index] = ['w','w','w'] 
     elif item == 'w': 
      root[index] = ['b','b'] 
    return root 

for i in range(3): 
    tree=change(root) 
print(tree) 

Как я могу создать бесконечный список, если это возможно?

+3

Вы не можете создать фактический бесконечный список; никогда не будет достаточно памяти, так как это конечный ресурс. –

+1

Помимо памяти, нет ограничений на то, сколько уровней вы можете вложить в списки. –

+0

@MartijnPieters Возможно, он имеет в виду, что ему нужно написать программу, которая * дает * потенциально бесконечный список списков, следующих за определенным шаблоном. – Tagc

ответ

1

Если я правильно понимаю ваши требования LY, это создает все бесконечное дерево в памяти (но требует лишь конечную памяти, так как она относится к себе):

black = [] 
white = [black, black] 
black.append([white, white, white]) 

root = black # or white, if you prefer 

Обратите внимание, что «B» и «W» листьев узлы никогда не появляется в дереве, как вы никогда не смогут их достичь.

+0

А, я получаю то, что было после этого. Хотя я не уверен, какую полезность он получает из него (каждый элемент и каждый дочерний элемент каждого элемента будут просто представлены как «[[[[...]], [[...]]], [[[ ...]], [[...]]], [[[...]], [[...]]]] '). +1 для понимания требований лучше меня. – Tagc

0

В комментариях на ваш вопрос, я предложил:

@MartijnPieters Возможно, он [OP] означает, что он должен написать программу, которая дающий потенциально-бесконечный список списков, которые следует определенному шаблону ,

Вы ответили, что это то, что вы хотите, чтобы я был пойти на это - код я пост включает в себя использование функции генератора, который можно использовать для создания потенциально нескончаемый последовательность что соответствует шаблону вы указываете (если бы мы принимали бесконечную память).

Недавно я увидел an incredible solution, отправленный кем-то для генерации последовательности взаимно простых пар. Это был первый раз, когда меня осознали всю умозрительную концепцию «саморекурсивных генераторов». Вы можете использовать их, чтобы сделать некоторые довольно удивительные вещи, такие как generate the Kolakoski sequence.

В любом случае у меня было ощущение, что я могу использовать саморекурсивные генераторы для решения вашей проблемы. Новости товаров - это то, что мой код работает. Плохая новость заключается в том, что я понятия не имею, почему мой код работает. Вот оно:

from enum import Enum 


class Colour(Enum): 
    BLACK = 'black' 
    WHITE = 'white' 

def generate_tree(curr_colour = Colour.BLACK): 
    yield [curr_colour] 
    for sub_tree in generate_tree(Colour.WHITE if curr_colour == Colour.BLACK else Colour.BLACK): 
     if curr_colour == Colour.WHITE: 
      tree = [sub_tree, sub_tree] 
     else: 
      tree = [sub_tree, sub_tree, sub_tree] 

     yield tree 

if __name__ == '__main__': 
    generator = generate_tree() 
    for _ in range(3): 
     print(next(generator)) 

Выход для п = 3

[<Colour.BLACK: 'black'>] 
[[<Colour.WHITE: 'white'>], [<Colour.WHITE: 'white'>], [<Colour.WHITE: 'white'>]] 
[[[<Colour.BLACK: 'black'>], [<Colour.BLACK: 'black'>]], [[<Colour.BLACK: 'black'>], [<Colour.BLACK: 'black'>]], [[<Colour.BLACK: 'black'>], [<Colour.BLACK: 'black'>]]] 

Вы можете использовать вариант ниже, чтобы иметь программу, которая держит генерирующий дерево бесконечно, ожидая на каждой итерации для пользовательский ввод:

if __name__ == '__main__': 
    generator = generate_tree() 
    while True: 
     print(next(generator)) 
     input() 
Смежные вопросы