티스토리 뷰

2021.02.15.월
재귀 호출 함수
void hi(){
printf("hi\n");
hi();
}
✔ 함수는 일반적으로 main함수 내부에서 호출되어 사용된다.
✔ 재귀 호출 함수는 함수가 스스로 자기 자신을 호출해서 사용하는 함수를 말한다.
✔ 위와 같이 hi() 함수의 내부에서 hi()가 한번 더 호출되는 경우가 재귀 호출 함수이다.
hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi....
✔ 함수는 호출될 때마다 stack영역에 쌓이고 종료 조건이 없는 재귀 함수는 stack overflow가 발생한다.
✔ 즉, 재귀 함수는 종료 조건을 설정하지 않으면 결국 메모리의 한계에 봉착하며 프로그램이 강제 종료된다.
✔ 그러므로 재귀 호출 함수를 사용할 때에는 반드시 종료 조건을 설정해야 한다.
재귀 호출 함수의 종료 조건
#include <stdio.h>
void hi(int count);
int main(void){
hi(5);
return 0;
}
void hi(int count){
if(count==0) return;
printf("hi\n");
hi(count-1);
}
✔ 종료 조건이 될 count를 매개변수로 설정하고, 함수 내에서 자신을 호출할 때 count의 값을 -1 해준다.
✔ 그리고 if문을 사용해 count가 0이 되는 순간 재귀를 종료한다.
재귀 호출 함수와 반복문의 차이
재귀 호출 함수 | 반복문 | |
기능 | 함수 내부에서 자기 자신을 호출. | 일련의 명령을 반복 실행. |
반복 | 종료 조건이 없거나 해당하지 않는 경우 반복. | 반복문의 조건식이 true일 때 반복. |
종료 | 매개변수를 받아 종료 조건을 지정. | 반복문의 조건식이 false일 때 종료. |
무한 반복 | 함수가 호출될 때마다 stack에 쌓이므로 무한 재귀는 stack overflow를 발생시킴. |
무한 루프는 CPU 사이클을 반복 사용. |
stack | 함수가 호출될 때마다 함수의 지역변수를 저장해야함. | 함수 호출이 아니므로, stack 사용X. |
실행 속도 | 함수를 계속 호출하므로 실행 속도가 느리다. | 정해진 명령문의 반복이므로, 실행 속도가 빠르다. |
코드의 이해 | 코드 길이와 변수가 적어 코드를 이해하기 쉽다. | 코드가 길고 여러 변수를 사용하므로 이해하기 어렵다. |
✔ 재귀는 반복문에 비해 변수나 조건식이 적다는 장점이 있지만, 메모리를 많이 차지하며 속도가 느리다는 단점이 있다.
✔ stack과 stack overflow에 대한 설명은 참고 링크 확인.
✔ 그렇다면 재귀 호출 함수를 언제 사용할 수 있을까?
✔ 주로 알고리즘이 가지는 의미가 재귀적인 표현이 자연스러운 경우에 사용한다 (예) 피보나치수열.
✔ 변수 사용을 줄인다 → 변수 사용이 줄어든다는 것은 오류가 생길 가능성이 줄어든다는 것을 의미.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[7일차] 1. 문자열(char형 배열) (0) | 2021.02.16 |
---|---|
[6일차] 2. 배열 (0) | 2021.02.15 |
[5일차] 숙제 - 코드업 1562. (0) | 2021.02.14 |
[5일차] 2. 함수 (0) | 2021.02.14 |
[5일차] 1. 중첩 반복문/break문/continue문 (0) | 2021.02.14 |