목차

이전 항목

2. 까다로운 재귀

다음 항목

4. 재귀 횟수 세기

현재 문서

주의사항

해당 문서는 중요 변경 작업 중에 있습니다. 일부 문서에 텍스트가 빠져있거나, 불어로 플레이스홀더(placeholder) 자리차지만 되어 있을 수 있습니다.

3. 더 많은 재귀

생각해봤던 마지막 프로그램은 다음과 같다:

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

주석

go_home 은 세번 호출된다... 리보그는 왼쪽으로 세번 회전한다. 아마도 리보그가 횟수를 세는데 사용할 무언가가 된다... 이점을 기억한다!

그렇기 때문에, 목적지에 도착한 후에, 프로그램을 종료하기 전에 리보그는 왼쪽으로 세번 회전한다. (아마도 축하 공연?)

시도해 보기!

상기 프로그램을 실행해서, 재귀 프로그램이 실제로 마지막에 리보그를 세번 회전하게 되는 것을 확인한다.

3.1. 또다른 테스트

다시 동일한 세상을 사용해서, 다음 프로그램을 실행하면, 리보그가 마지막으로 향하는 방향을 알아낼 수 있을까?

힌트

def go_home():
    move()
    if not at_goal():
        go_home()
        turn_left()
    turn_left()

# 지금 실행한다!
go_home()

직접 작성해 본다!

실행하지 않고 상기 프로그램이 해독한다. 그리고 나서, 리보그를 실행해서 이해한 것을 점검한다. 프로그램을 실행하기 전에, 리보그가 이미 목적지에 도착해 있다면, 무슨 일이 벌어질까?