본문 바로가기
Coding/C

C언어 - 재귀 함수 (recursion)

by ZaRi 2023. 6. 3.

 

 이제 저번 동적할당에 이어서 재귀 함수에 대해 알아보겠습니다. 

 재귀함수는 동적할당처럼 자료구조에서 자주 쓰이는 것 같습니다.

 

 


재귀함수

재귀함수

: 함수 내에서 자신을 다시 호출

 

 

형태 ex)
반환형 함수이름(매개변수)
{
    함수이름();
}
void Add()
{
    Add();
}

 

 우선 형태는 위와 같습니다. 

 재귀 함수가 이름은 어려워 보이지만 실제로 보면 그저 함수 내부에서 자신의 함수를 다시 호출하는 것 뿐입니다.

 이때 잘 못하면 while문 처럼 무한 반복이 일어날 수 있으니 조심해야 합니다.

 

 다음 코드를 봐보겠습니다.

 

 

 

#include <stdio.h>

void Add()
{
    printf("하이요\n");
    Add();
}

int main()
{
    Add();

    return 0;
}

 

위 재귀 함수를 보면 함수가 계속 자신을 호출해서 무한 반복이 일어나게 됩니다.

그래서 결과를 봐보면.

 

 

&#39;하이요&#39;가-무한출력됨
결과1

이렇게 무한히 출력되다가 멈추게 멈추게 됩니다.

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인 값이 넘어가는 순간 이 재귀함수는 종료되게 만들었습니다.

실행해보면.

 

 

 

하이요가-여러개-출력됨
결과2

 

 이렇게 출력되다가 멈춘 것을 확인할 수 있습니다. 재귀함수를 사용하면 더 다양한 것을 만들 수 있습니다.

 

 

 

활용하기

 원하는 숫자부터 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입력후-5050이-출력됨
결과3

 

그러면 1부터 100까지 다 더하는 함수를 만들 수 있었습니다.

 


 재귀 함수를 알아보았습니다. 제 경험상 재귀함수는 너무 이렇게 간단한 건 쉬워보이지만, 이제 좀 어려워지기 시작하고 응용하기 시작하면 정말 어려워지기 때문에, 이거는 익숙해지는 것밖에 답이 없는 것 같습니다.

댓글