1. 개요 & 알고리즘

"재귀 호출로 문제를 해결함은 실행 시간이나 시스템의 위험성을 희생하고 소스의 간결함을 추구하고자 하느 ㄴ경우이다. 그래서 재귀 함수는 프로그램의 초기 작성 단계에서 애용되는 함수이다. 그리고 프로그램의 마무리 단계에서 재귀 함수는 같은 기능을 하는 비재귀 함수로 바꾸어지게 마련이다."

재귀적으로 문제를 해결함은 또 문제를 점점 더 작은 단위로 쪼개어서 해결함을 의미한다. 커다란 문제는 해결하기 위한 방법이 어려울지 모르나, 작은 문제는 해결 방법이 눈에 보이기 마련이다. 이렇게 큰 문제를 작은 문제로 쪼개어서 문제를 해결하는 방법이 재귀 호출을 이용하는 방법이다." (C로 배우는 알고리즘, p.263~p.264)


"재귀 호출이 이루어질 때마다 문제는 점점 작아져야 하며, 또한 재귀 호출이 끝이 나는 종료 조건(Terminate condition)이 있어야 한다는 것이다." (C로 배우는 알고리즘, p.266)


"재귀 호출은 한 함수 내에서 한번만 이루어져야 하는 것은 아니다. 한 함수 내에서 두번 혹은 그 이상도 자기자신을 호출할 수 있다. 자기 호출 횟수는 주어진 문제를 몇 개로 나누어서 푸느냐에 따라 결정이 된다." (C로 배우는 알고리즘, p.267)


"하노이의 탑 문제"는 세 개의 기둥과 서로 다른 크기인 N개의 원반으로 구성되며, 이 원반들은 세 걔의 기둥 중의 하나에 반드시 꽂혀 있어야 하고, 자신보다 작은 원반 위에는 그 원반을 놓을 수 없습니다. 그리고 기둥 1에서 기둥 3으로 모두 옮기는 것이 목표입니다.

하노이 탑의 문제를 푸는 방법은 다음과 같이 재귀적으로 표현할 수 있습니다.

1. 기둥 1에서  N-1 개의 원반을 기둥 2로 옮긴다.

2. 기둥 1에서 1개의 원반을 기둥 3으로 옮긴다.

3. 기둥 2에서 N-1개의 원반을 기둥 3으로 옮긴다.


2. Python에서의 무한 재귀 호출


Python으로 잘못된 재귀 호출(무한 호출)하도록 함수를 구현 후 실행해 보았습니다.

def rose():
rose()

실행시 일정 횟수를 실행하면 아래와 같은 메시지를 출력하면서 멈춥니다.

RecursionError: maximum recursion depth exceeded

Python은 Stack overflow에 의한 system 불안정을 막기 위해서 Recursion에 limitation을 가지고 있습니다.[각주:1] 아래 명령어를 가지고 maximum recursion 횟수를 확인할 수 있습니다. 물론 sys 모듈을 사용하기 위해서 "import sys"를 먼저 해 줘야 합니다.

sys.getrecursionlimit()

그리고, 아래 명령어로 설정을 변경할 수 있습니다.

sys.setrecursionlimit(recursion횟수)

3. 동작 코드

원반을 from 기둥에서 to 기둥으로 by 기둥을 이용하여 옮기는 과정입니다.

def hanoi(self, num, where_from, where_by, where_to):
if num == 1:
self.move (where_from, where_to)
else:
self.hanoi (num-1, where_from, where_to, where_by)
self.move(where_from, where_to)
self.hanoi(num - 1, where_by, where_from, where_to)

(개인적으로 충분히 이해하지 못했습니다. 좀더 복잡할 것이라 생각했는데, 너무 당연하다거나 단순한 내용이 동작하는 것에 놀랍기도 합니다.)


4. 실행 코드

실행코드는 간단합니다.("C로 배우는 알고리즘" 리스트 4-1 : HANOI.C에 대응)

# main() function
if __name__ == "__main__":
number = int(input("Enter height of HANOI tower -> "))
hanoi = Hanoi()
# From 1st pole to 3rd pole by using 2nd pole
hanoi.hanoi(number, 1, 2, 3)

5. 코드


6. 기타

주로 "C로 배우는 알고리즘"에 적혀 있는 내용을 주로 사용하고, 필요시 인터넷 검색의 결과를 이용하였습니다. 이용한 출처는 밝히는 것을 원칙으로 합니다만, 혹시 실수가 있거나 문제되는 사항이 있다면 알려 주십시오. 수정하도록 하겠습니다.


  1. https://stackoverflow.com/questions/3323001/what-is-the-maximum-recursion-depth-in-python-and-how-to-increase-it [본문으로]
반응형

+ Recent posts