2017-01-16 12 views
-2

私は、特定の規則に従ってリストのリストを作成するタスクを持っています。リストは、ルートを持つツリーを表す必要があり、このルートから特定の色で分岐します。各ブランチはその子要素のリストとして表されるべきです(1つの黒いブランチは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

ああ、私は今OPが何だったかを取得します。私は彼がそれからどんな効用を得ているか分かりませんが(すべての要素とすべての要素のすべての子はちょうど[[...]]、[[...]]]、[[[ ...]]、[[...]]]、[[[...]]、[[...]私よりも要件を理解するために+1。 – Tagc

0

は、私が提案:

@MartijnPietersをおそらく彼[OP]は、彼が利回り一定のパターンを以下のリストの潜在的に無限のリストのプログラムを書き込む必要があること。

は、あなたはそれはあなたが望むものだと答えたので、私はそれで行くを持っていた - 私は、ポストコードを使用すると、パターンを次の潜在的に終わることのないシーケンスを生成するために使用できるファンクション・ジェネレータを、使用することを含みますあなたが指定する場合(無限のメモリを想定する場合)

少し前に、私はan incredible solutionが誰かによって投稿されて、ペアのペアのシーケンスを生成することがわかりました。 「自己再帰的な発電機」の概念を念頭に置いたのは初めてのことでした。あなたはgenerate the Kolakoski sequenceのようなかなり素晴らしいものをやるためにそれらを使うことができます。

いずれにしても、自分の問題を解決するために自己再帰型発電機を使用することができたと感じました。商品ニュースは私のコードが働くことです。悪い知らせは、私のコードがなぜ機能するのかわかりません。ここにある:あなたがのために各反復で待っている、無期限ツリーを生成し続けるプログラムを持ってするには、以下のバリアントを使用することができます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'>]]] 

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)) 

出力ユーザー入力:

if __name__ == '__main__': 
    generator = generate_tree() 
    while True: 
     print(next(generator)) 
     input() 
関連する問題