강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của sksungsu
sksungsu

câu hỏi đã được viết

trăn trung cấp

Iterator và Generator 4

이터레이터와 제러네이터 4 - 재귀 제너레이터

Viết

·

102

·

Đã chỉnh sửa

0

안녕하세요 강사님.

제목의 강의 중에서 depth_first 함수의 동작이 궁금하여 기본 코드에서 "2.코드 변경"과 같이 print 문을 추가 하여 분석 중 "3. 실행결과"와 같이 출력 되는 것을 확인 하였습니다.

  1. 질문

Node(3) 출력하기 전에 s-yield가 한번 출력 되어야 할 것 같은데 두 번 출력에 대한 해석이 안됩니다.

f-yield Node(3)
s-yield Node(1) Node(3)
s-yield Node(0) Node(3)
Node(3)

@@추가

질문을 올려 놓고 고민 하다 보니 Node(1).depth_first() 함수가 한번만 호출 된다고 생각했는데.

프로그램이 종료 될 때 까지 총 4번이 호출 되면 말이 되는 듯 한데.. 추측한 시나리오가 맞는지요?

Node(1).depth_first() : next(Node(1)) 4번 호출

Node(3).depth_first() : next(Node(3)) 2번 호출

Node(4).depth_first() : next(Node(4)) 2번 호출

Node(2).depth_first() : next(Node(2)) 3번 호출

Node(5).depth_first() : next(Node(5)) 2번 호출

 

  1. 코드 변경

    def depth_first(self):
        print("f-yield",self)
        yield self
        print("f-next",self)
        
        for c in self:
            for x in c.depth_first():
                print("s-yield",self,x)
                yield x
                print("s-next",self,x)
  1. 실행 결과

f-yield Node(0)
Node(0)
f-next Node(0)
f-yield Node(1)
s-yield Node(0) Node(1)
Node(1)
s-next Node(0) Node(1)
f-next Node(1)
f-yield Node(3)
s-yield Node(1) Node(3)
s-yield Node(0) Node(3)
Node(3)
s-next Node(0) Node(3)
s-next Node(1) Node(3)
f-next Node(3)
f-yield Node(4)
s-yield Node(1) Node(4)
s-yield Node(0) Node(4)
Node(4)
s-next Node(0) Node(4)
s-next Node(1) Node(4)
f-next Node(4)
f-yield Node(2)
s-yield Node(0) Node(2)
Node(2)
s-next Node(0) Node(2)
f-next Node(2)
f-yield Node(5)
s-yield Node(2) Node(5)
s-yield Node(0) Node(5)
Node(5)
s-next Node(0) Node(5)
s-next Node(2) Node(5)
f-next Node(5)
pythonnumpymatplotlib웹-스크래핑병렬-처리

Câu trả lời 1

0

안녕하세요, 인프런 AI 인턴입니다.
조성수님께서 궁금해하신 내용에 대해 설명드리겠습니다.

재귀 제너레이터 함수 depth_first는 노드를 깊이 우선 탐색하며 각 노드에서 yield문이 작동할 때마다 현재의 노드를 반환합니다. 추가하신 print문 덕분에 이 함수의 실행 흐름을 잘 문맥적으로 보실 수 있습니다.

질문하신 대로 Node(1).depth_first() 호출이 여러 번 발생하는 이유는 이 함수가 제너레이터이기 때문입니다. 제너레이터는 next() 호출 시마다 yield 지점에서 나갑니다. 즉, 제너레이터를 통해 루프를 돌면, 각각의 노드에서 yield 지점으로 들어가고 나가는 과정이 반복됩니다.

제너레이터 호출이 여러 번 발생하는 것은 각 자식 노드로 내려간 다음 자식 노드를 탐색을 마친 후 다시 돌아오면서 상위 노드에서의 for문이 계속 진행되기 때문입니다. 따라서 루트를 포함한 각 노드의 depth_first 함수 호출이 여러 번 발생합니다.

다음은 코드의 흐름에 대한 설명입니다:
1. f-yieldf-next는 각각 노드가 yield되기 전과 후의 상태를 나타냅니다.
2. s-yields-next는 부모 노드의 컨텍스트에서 자식 노드에 대한 yield 전과 후의 상태를 나타냅니다.

이 점을 염두에 두시고 호출의 흐름을 따라가면 모든 yield 호출이 이해가 되실 것입니다. 추가로 코드를 시각적으로 디버깅하며 노드의 탐색 순서를 확인하는 것도 도움이 될 것입니다.

제시된 재귀 탐색 예시를 이용하여 이해를 깊게 하시길 바랍니다. 추가적인 내용이 필요하시면 언제든지 문의 주세요!

자세한 내용 보기

Hình ảnh hồ sơ của sksungsu
sksungsu

câu hỏi đã được viết

Đặt câu hỏi