ë” ë§Žì€ ìž¬ê·€ ============== ìƒê°í•´ë´¤ë˜ 마지막 í”„ë¡œê·¸ëž¨ì€ ë‹¤ìŒê³¼ 같다:: def go_home(): if not at_goal(): move() go_home() turn_left() # 지금 실행한다! go_home() # 첫번째 호출 지금까지, ì•„ë§ˆë„ ì–´ë–»ê²Œ ë™ìž‘하는지 ì•Œì•„ëƒˆì„ ê²ƒì´ë‹¤; 최소한으로, í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í–ˆì–´ì•¼ë§Œ ëœë‹¤! **Home 1** 세ìƒì—ì„œ ìƒê¸° í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•œë‹¤ê³ ê°€ì •í•˜ê³ , í”„ë¡œê·¸ëž¨ì„ ë¶„ì„í•´ë³´ìž. 늘 ê·¸ë ‡ë“œì‹±, ëª…ë ¹ì–´ 하나를 ìƒê°í•´ë³´ìž:: go_home() ìƒê¸° ëª…ë ¹ì–´ëŠ” ì •ì˜ëœ 함수 몸통부분으로 êµì²´ëœë‹¤:: if not at_goal(): move() go_home() # ë‘번째 호출 turn_left() 리보그가 ì•„ì§ ëª©ì ì§€ì— ë„달하지 않았기 때문ì—, ``if`` 문 코드 ë©ì–´ë¦¬ê°€ 실행ëœë‹¤:: move() go_home() # ë‘번째 호출 turn_left() 다시 한번, ``go_home()`` ì„ ì •ì˜ëœ 함수 몸통으로 êµì²´í•œë‹¤:: move() if not at_goal(): move() go_home() # third call turn_left() turn_left() ê·¸ë¦¬ê³ , í•œë²ˆë” ìˆ˜í–‰ë˜ë©´:: move() move() if not at_goal(): move() go_home() # 4번째 호출 turn_left() turn_left() turn_left() ë‘번째 ``move()`` ëª…ë ¹ì–´ 다ìŒì—, 리보그가 목ì ì§€ì— ë„달해서, ``if`` 문장 코드 ë©ì–´ë¦¬ëŠ” 실행ë˜ì§€ 않는다:: move() move() if not at_goal(): move() # 호출ë˜ì§€ ì•ŠìŒ go_home() # 호출ë˜ì§€ ì•ŠìŒ turn_left() turn_left() turn_left() .. note:: ``go_home`` ì€ ì„¸ë²ˆ 호출ëœë‹¤... 리보그는 왼쪽으로 세번 íšŒì „í•œë‹¤. ì•„ë§ˆë„ ë¦¬ë³´ê·¸ê°€ 횟수를 ì„¸ëŠ”ë° ì‚¬ìš©í• ë¬´ì–¸ê°€ê°€ ëœë‹¤... ì´ì ì„ ê¸°ì–µí•œë‹¤! ê·¸ë ‡ê¸° 때문ì—, 목ì ì§€ì— ë„ì°©í•œ 후ì—, í”„ë¡œê·¸ëž¨ì„ ì¢…ë£Œí•˜ê¸° ì „ì— ë¦¬ë³´ê·¸ëŠ” 왼쪽으로 세번 íšŒì „í•œë‹¤. (ì•„ë§ˆë„ ì¶•í•˜ 공연?) .. topic:: ì‹œë„í•´ 보기! ìƒê¸° í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•´ì„œ, 재귀 í”„ë¡œê·¸ëž¨ì´ ì‹¤ì œë¡œ ë§ˆì§€ë§‰ì— ë¦¬ë³´ê·¸ë¥¼ 세번 íšŒì „í•˜ê²Œ ë˜ëŠ” ê²ƒì„ í™•ì¸í•œë‹¤. ë˜ë‹¤ë¥¸ 테스트 ---------------------- 다시 ë™ì¼í•œ 세ìƒì„ 사용해서, ë‹¤ìŒ í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ë©´, 리보그가 마지막으로 향하는 ë°©í–¥ì„ ì•Œì•„ë‚¼ 수 있ì„까? .. hint:: .. code-block:: py3 def go_home(): move() if not at_goal(): go_home() turn_left() turn_left() # 지금 실행한다! go_home() .. topic:: ì§ì ‘ 작성해 본다! 실행하지 ì•Šê³ ìƒê¸° í”„ë¡œê·¸ëž¨ì´ í•´ë…한다. ê·¸ë¦¬ê³ ë‚˜ì„œ, 리보그를 실행해서 ì´í•´í•œ ê²ƒì„ ì 검한다. í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ê¸° ì „ì—, 리보그가 ì´ë¯¸ 목ì ì§€ì— ë„ì°©í•´ 있다면, 무슨 ì¼ì´ 벌어질까?