본문 바로가기

프로그래밍/C언어

[C언어] 재귀함수의 사용과 stack Overflow

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

1. 재귀 함수란? 


- 자기 자신을 재호출하는 함수로 계속해서 자기 자신을 호출할 수 있기 때문에 반복 연산에 많이 사용된다.자기 자신을 무한정 호출할 수도 있기 때문에 조건문을 제대로 만들어 주지 않으면 오류가 발생하기 쉽지만 잘 사용하면 보기 쉬운 간략한 코드를 만들기도 한다. 


예제코드 

 



 재귀 호출 결과값 

 




2. 재귀 함수의 사용



재귀 함수라 하면 일단 자기자신을 호출해야 한다. 



 그리고 절대 탈출 조건이 빠져서는 안된다. 재귀 함수는 반복문과 같은 형태를 띄기 때문에 탈출 조건이 없다는 것은 무한 루프에 빠지겠다는 것과 같다. 재귀 호출을 사용할 때는 항상 탈출 구문에 주의해야 한다.



3. 재귀 함수와 Stack Overflow


- 예제 코드에서는 보기 쉽게 10회면 함수를 호출하지만 실제 프로그램 안에서는 재귀함수의 호출이 얼마나 일어나게 될지 예상하기는 쉽지 않다. 대부분은 가변적으로 호출을 하기 때문에 10번이 아닌 1000번 10000번 될 수 있다. 만약 10만번을 호출한다는 가정하에 프로그램을 실행하면......




 출력되는 에러 메세지를 볼 수 있다. 보면 결과값이1만이 되기도 전에 오류가 나는걸 볼 수 있는데 반복문을 사용해 1만번을 돌리면 에러가 발생하지는 않는다. 그렇다면 반복문과 재귀호출 둘의 차이점이 무엇일까. 바로 '함수를 호출한다'와 '호출하지 않는다'이다.




 함수가 호출될 때 스택 메모리를 사용하게 되는데 재귀호출은 함수가 꼬리에 꼬리를 물고 실행되기 때문에 계속해서 메모리에 쌓이게 된다. 계속해서 호출되다 메모리가 부족해 에러가 나는 것이다. 물론 재귀호출이 아니여도 많은 함수를 연속적으로 호출하면 같은 에러가 발생할 수 있다. 위와같은 이유에서 재귀함수를 사용할 때는 호출을 제한하거나 반복문으로 대체하는 것이 좋다.