2017-01-16 1 views
-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

귀하의 요구 사항을 정확하게 이해하고 있다면 잎 노드가 트리에 표시되지 않습니다 'w'는 'B'것을

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

root = black # or white, if you prefer 

주를 당신으로, (그 자체를 의미하기 때문 만 한정된 메모리를 필요로) LY,이 메모리에 전체 무한 트리를 생성 결코 실제로 도달 할 수 없습니다.

+0

아, 나는 어떤 OP가 지금 이었는지에 관해 알아 들었다. 그가 어떤 유틸리티로부터 빠져 나올지 확신하지는 않지만 (모든 요소와 모든 요소의 모든 자식은 단지 [[...]], [[...]], [[[] ...]], [[...]], [[...]]]). +1 나를 통해 요구 사항을 이해하지만. – Tagc

0

, 내가 제안 :

@MartijnPieters 아마도 그는 [영업 이익] 그는 특정 패턴을 다음 목록의 잠재적 무한 목록를 산출하는 프로그램을 작성해야 의미 .

당신은 만약 당신이 원하는 대답했다, 그래서 나는 그것을 시도를했다 - 나는 게시 코드가 패턴을 따르는 잠재적으로 끝없는 순서을 생성하는 데 사용할 수있는 함수 발생기를 사용하는 것 당신은 (우리가 무한한 메모리를 가정한다면) 지정한다.

잠시 전에 나는 coprime 쌍의 순서를 생성하기 위해 누군가가 게시 한 an incredible solution을 보았습니다. 내가 "자기 재귀 적 생성기"라는 개념을 완전히 깨닫게 된 것은 이번이 처음이다. 당신은 그들을 generate the Kolakoski sequence과 같은 꽤 멋진 것들을하기 위해 사용할 수 있습니다.

어쨌든 나는 스스로 재귀 적 발전기를 사용하여 문제를 해결할 수 있다고 생각합니다. 상품 뉴스는 제 코드가 작동한다는 것입니다. 나쁜 소식은 왜 내 코드가 작동하는지 전혀 모른다는 것입니다. 여기있다 : N에 대한

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() 
관련 문제