이제 저번 동적할당에 이어서 재귀 함수에 대해 알아보겠습니다.
재귀함수는 동적할당처럼 자료구조에서 자주 쓰이는 것 같습니다.
재귀함수
재귀함수
: 함수 내에서 자신을 다시 호출
형태 | ex) |
반환형 함수이름(매개변수) { 함수이름(); } |
void Add() { Add(); } |
우선 형태는 위와 같습니다.
재귀 함수가 이름은 어려워 보이지만 실제로 보면 그저 함수 내부에서 자신의 함수를 다시 호출하는 것 뿐입니다.
이때 잘 못하면 while문 처럼 무한 반복이 일어날 수 있으니 조심해야 합니다.
다음 코드를 봐보겠습니다.
#include <stdio.h>
void Add()
{
printf("하이요\n");
Add();
}
int main()
{
Add();
return 0;
}
위 재귀 함수를 보면 함수가 계속 자신을 호출해서 무한 반복이 일어나게 됩니다.
그래서 결과를 봐보면.
이렇게 무한히 출력되다가 멈추게 멈추게 됩니다.
while문과 다르게 무한히 출력되지 않고 중간에 멈추는 이유는 자세히는 모르겠지만 컴파일러가 일종의 오류로 보고 빠져나올 수 있게 만들어 놓은 것 같습니다.
그래서 조건을 걸어 살짝 수정해보겠습니다.
#include <stdio.h>
void Add(int n)
{
if (n == 10) return;
printf("하이요\n");
Add(++n);
}
int main()
{
Add(1);
return 0;
}
이렇게 중간에 if문을 사용하고, 다음 함수로 넘어갈때마다 n에 전위증가연산자를 붙여줘서 값을 넘기게 되면.
n이 10인 값이 넘어가는 순간 이 재귀함수는 종료되게 만들었습니다.
실행해보면.
이렇게 출력되다가 멈춘 것을 확인할 수 있습니다. 재귀함수를 사용하면 더 다양한 것을 만들 수 있습니다.
활용하기
원하는 숫자부터 100까지 더하는 코드를 만들어보았습니다.
#include <stdio.h>
int Add(int num)
{
if (num == 100)
return 100;
return Add(num + 1) + num;
}
int main()
{
int num;
printf("원하는 숫자: ");
scanf("%d", &num);
printf("%d", Add(num));
return 0;
}
num 이라는 변수의 숫자가 100이 되는 순간 멈춰라 라는 코드를 만들었습니다.
그럼 실행해보겠습니다.
그러면 1부터 100까지 다 더하는 함수를 만들 수 있었습니다.
재귀 함수를 알아보았습니다. 제 경험상 재귀함수는 너무 이렇게 간단한 건 쉬워보이지만, 이제 좀 어려워지기 시작하고 응용하기 시작하면 정말 어려워지기 때문에, 이거는 익숙해지는 것밖에 답이 없는 것 같습니다.
댓글