我有一项任务是按照特定规则制作列表清单。 List必须表示具有根的树,并且具有特定颜色的根。每个分支应表示为其子元素的列表(一个黑色分支生成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)
如果可能,我如何生成无限列表?
答案 0 :(得分:1)
如果我正确理解你的要求,这会在内存中创建整个无限树(但只需要有限的内存,因为它指的是自己):
black = []
white = [black, black]
black.append([white, white, white])
root = black # or white, if you prefer
请注意''和' w'叶子节点永远不会出现在树中,因为你永远无法实现它们。
答案 1 :(得分: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))
输出n = 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()