까다로운 재귀 ================ 약간 더 복잡한 예제를 고려하기 전에, 이전 예제를 재검토하자:: def go_home(): if not at_goal(): move() go_home() # 지금 실행한다! go_home() 이제, 함수가 호출될 때, 저자가 설명한 것을 기억한다. 함수 몸통으로 함수호출을 교체하는 것으로 간주할 수 있다. 이것에 따라서, 상기 프로그램은 다음이 된다:: if not at_goal(): move() go_home() **Home 1** 세상에서, 처음 명령어가 실행될 때, ``at_goal``은 ``false``가 되어, ``not at_goal()``은 ``true``가 된다고 가정한다. ``move`` 와 ``go_home()`` 에 대한 함수 호출이 실행되고, 상기 코드는 다음과 동치가 된다:: move() go_home() ``go_home()`` 에 대한 호출을 원래 정의로 교체할 수 있다:: move() if not at_goal(): move() go_home() 그리고, 이론적으로, 항상 ``go_home()`` 에 대한 함수 호출을 원래 함수정의로 대체함으로써, 영원히 진행할 수 있다. 하지만, 이런 상황은 원치는 않는데, 종국에는 끝마쳐야만 된다... **Home 1** 세상에서 다행스럽게도 수행한 작업이다. 두번째 ``move()`` 다음 경우에, ``at_goal()` `은 참이 되고, ``if`` 문은 무시된다. 따라서, 이 경우에 코드는 다음과 동등하게 된다:: move() move() **더 진도를 나가기 전에, 상기 설명을 이해하는 것이 매우 중요하다.** 약간 더 까다로운 예제를 풀어가면서 필요하다면, 몇번이고 반복해서 읽어 확실히 내 것으로 한다. 작은 변경... --------------- 다음 프로그램을 생각해보자:: def go_home(): if not at_goal(): move() go_home() turn_left() # 지금 실행한다! go_home() .. topic:: 생각해보기 리보그가 상기 명령을 실행하기 전에, 어떤 작업을 수행하는지 알아낸다. 설명은 다음번 학습에 나와 있다.