lth00   5달 전

요 코드에서 hanoi()함수가 return;이 없는데도 정상적으로 종료가 되는데 void형 함수에서 스택을 종료시키는 조건이 따로 있나요? 재귀함수가 어떠한 조건에서 종료되는지 궁금합니다..

pill27211   5달 전

void형 함수이므로 당연히 코드가 위에서 아래로 모두 진행될 경우 hanoi()의 호출이 끝나겠지요.(단지 재귀함수이므로 최초 호출 hanoi()의 코드 진행이 끝나야 완전히 종료됨)

풀어서 말씀 드리면

1. 25줄 코드에 의해서 hanoi()가 최초로 실행됩니다.

이후

2. 13줄 코드에 의해서 hanoi(n - 1, from, to, tmp);가 실행돼(물론 n의 값에 따라 실행되지 않을 수도 있음.) 또다른 hanoi()가 실행 됩니다.(1에서 파생된 호출)

3. 1에서 파생된 hanoi()에 의해 또다른 hanoi()가 실행 됩니다.(아직 최초의 hanoi()는 종료되지 않았음. 14, 15의 코드가 진행되지 않은 상태)

.

.

.

위의 과정을 n이 1이 될 때까지 계속 반복하겠죠. 그렇게 계속된 파생, 호출을 반복하다가 어느 순간 n이 1이 되는 시점이 옵니다.( = 마지막으로 파생된 hanoi()) 그러면 7에 의해 9의 문장을 수행하고 이하의 코드가 없으므로 종료되겠죠. -> 이후 바로 직전 hanoi()의 13의 문장이 수행됐다는 것이므로 14, 15의 문장을 수행한 뒤 또 직전 hanoi()로 올라갑니다.

.

.

.

결과적으로 reverse(9)->reverse(8)-> ... reverse(1)처럼 재귀 함수가 호출될 경우

호출 완료 사인은 reverse(1)->reverse(2)->... reverse(9)과 같이 진행될테고 최초 호출된 reverse(9)의 코드 진행이 모두 끝나면

곧 재귀호출이 끝났다는 뜻입니다.

wider93   5달 전

함수의 맨 마지막 줄에 return;이 있다고 간주하면 됩니다.

lth00   5달 전

감사합니다!!

댓글을 작성하려면 로그인해야 합니다.