프로그래밍/C 기초

[C언어 강좌] #28 재귀함수

도끼_Dokki 2017. 1. 3. 09:00

이번에는 재귀함수를 배워봅시다.


우리가 맨날 쓰는 int main(void)함수가 있습니다. main함수에서 다른 함수를 호출하죠,

그렇다는 말은 함수에서 다른 함수를 호출할수 있다는 얘기가되죠.

근데 함수가 다른함수가 아닌 자기 자신을 다시 호출하면 어떻게될까요?

그게 바로 재귀함수입니다. 오늘은 재귀함수에 대해서 설명해드리겠습니다.



이런식으로 함수속에서 자기 자신을 다시한번 호출하는게 재귀함수입니다.

하지만 위와같은 코드는 무한반복을 하게 되버립니다.




그렇기때문에 위 예제처럼 재귀함수가 끝날수 있게 만들어줘야합니다.

근데 여기서 헷갈리실수도 있는 부분이 있습니다.



자기 자신을 호출했을때 그냥 처음부터 함수를 다시 실행시키는 형태가 아닙니다!

위와같은 그림은 틀렸습니다.


함수를 호출하면 또 하나의 함수가 실행되는것입니다.

지금 실행되고 있던 함수가 처음으로 돌아가는게 아닙니다.




만약 자기 자신을 호출할경우 첫부분으로 돌아가서 다시 실행하는 구조였다면 World는 출력되지 않았을겁니다.


아까처럼 무한루프되는 재귀함수를 만들었을때는 이런형태로 실행됩니다.

똑같은 함수가 하나 더 만들어져서 그 함수에서 다시 진행되는형태라고 보면 됩니다.


함수를 호출하면 호출한 자리에 함수에 있는 코드가 복사 붙여넣기 되는 방식이라고 생각하셔도 됩니다.

하지만 이렇게 생각할경우 한가지 주의할점은 호출한곳에 있는 지역변수를 함수에서 사용할수 없다는점입니다.

그래서 그냥 위의 그림처럼 생각하는편이 더 정확하다고 볼수 있습니다.


무한루프를 막기위해서 재귀함수의 끝을 정해주면 위와같은 흐름이 만들어지겠죠.

위 그림을 보면 함수를 호출한 후 그 함수에서 또 한번 진행되고 반환된후 그다음의 원래 코드가 진행됩니다.

그래서 Hello가 모두 출력된다음 World가 출력됩니다.