정보처리기사

[정처기] 02. C언어 함수, 재귀 +연습 문제

gani00 2026. 6. 26. 18:05

목차

  • 함수
  • 재귀

C 함수

“입력 받아서 처리하고 결과를 돌려주는 코드 묶음”

함수의 기본 모양

반환형 함수이름(매개변수) {
    실행할 코드
    return 반환값;
}

예시:

int add(int a, int b) {
    return a + b;
}
  • int : 이 함수가 마지막에 int 값을 돌려준다는 뜻
  • add : 함수 이름
  • int a, int b : 함수가 받을 입력값
  • return a + b : 결과를 호출한 곳으로 반환

호출 방법

int result = add(3, 5);
printf("%d", result);  // 8
main → add(3, 5) 실행 → 8 반환 → result에 저장

함수 선언, 정의, 호출

함수가 main 위에 있느냐 아래에 있느냐

#include <stdio.h>

int add(int, int);   // 1. 선언

int main() {
    printf("%d", add(2, 3));  // 3. 호출
    return 0;
}

int add(int a, int b) {  // 2. 정의
    return a + b;
}
  • 선언: “이런 함수가 뒤에 있어요”라고 컴파일러에게 미리 알림
  • 정의: 함수의 실제 내용 작성
  • 호출: 함수를 실행

함수 정의가 main보다 위에 있으면 선언은 생략 가능

int add(int a, int b) {
    return a + b;
}

int main() {
    printf("%d", add(2, 3));
}

매개변수와 인자

int add(int a, int b) {
    return a + b;
}

int main() {
    add(10, 20);
}

 

위치 이름
함수 정의 쪽 매개변수(parameter) a, b
함수 호출 쪽 인자(argument) 10, 20

 

add(10, 20)

호출 시 10은 a로, 20은 b로 복사돼 들어간다.


C는 기본적으로 값이 복사된다

void change(int x) {
    x = 100;
}

int main() {
    int n = 10;
    change(n);
    printf("%d", n);
}

 

정답: 10

change(n)을 하면 n의 값인 10만 x에게 복사

main의 n = 10
         ↓ 복사
change의 x = 10

함수 안에서 x를 100으로 바꿔도, 원래 n은 안 바뀜.

void change(int x) {
    x = 100;
}

이건 사실상 함수 안의 별도 지역변수 x만 바꿈

원본 값을 바꾸려면 주소를 넘겨야 함.

void change(int *x) {
    *x = 100;
}

int main() {
    int n = 10;
    change(&n);

    printf("%d", n);  // 100
}
change(&n)
→ n의 주소 전달
→ x가 n의 주소를 가리킴
→ *x = n
→ *x = 100은 n = 100

void 함수

반환값이 없으면 void를 사용해.

void printHello() {
    printf("Hello");
}
int main() {
    printHello();
}

void 함수에서는 보통 값을 반환 X

void printHello() {
    return;  // 가능: 함수 종료만 함
}
void printHello() {
    return 10;  // 오류
}

반대로 int 함수는 보통 int 값을 반환

int add(int a, int b) {
    return a + b;
}

지역변수의 범위

함수 안에서 만든 변수는 그 함수 안에서만 유효

void func() {
    int x = 10;
}

int main() {
    printf("%d", x);  // 오류
}

x는 func() 안에서만 존재하는 지역변수

그리고 같은 이름을 써도 서로 다른 변수일 수 있음.

int x = 1;

void func() {
    int x = 10;
    printf("%d ", x);
}

int main() {
    func();
    printf("%d", x);
}

정답: 10 1

 


재귀함수

기본 구조

int func(int n) {
    if (종료 조건) {
        return 값;
    }

    return func(더 작은 문제);
}

 

1. 종료 조건(base case)
2. 자기 자신을 다시 호출하는 부분(recursive case)

종료 조건이 없으면 계속 자기 자신을 부르다가 프로그램이 터져.


가장 기본적인 재귀 예시

int sum(int n) {
    if (n == 0) {
        return 0;
    }

    return n + sum(n - 1);
}

sum(4)의 흐름:

sum(4)
= 4 + sum(3)

= 4 + 3 + sum(2)

= 4 + 3 + 2 + sum(1)

= 4 + 3 + 2 + 1 + sum(0)

= 4 + 3 + 2 + 1 + 0

= 10
호출 내려감:
sum(4) → sum(3) → sum(2) → sum(1) → sum(0)

반환 올라감:
0 → 1 → 3 → 6 → 10

팩토리얼

int fact(int n) {
    if (n == 1) {
        return 1;
    }

    return n * fact(n - 1);
}
fact(4)
= 4 * fact(3)

= 4 * 3 * fact(2)

= 4 * 3 * 2 * fact(1)

= 4 * 3 * 2 * 1

= 24

재귀에서 지역변수는 호출마다 따로 생긴다

void func(int n) {
    int x = n;
    printf("%d ", x);

    if (n > 0) {
        func(n - 1);
    }
}
func(3)의 x = 3
func(2)의 x = 2
func(1)의 x = 1
func(0)의 x = 0

각 함수 호출은 서로 다른 공간에서 실행

func(3)
 └─ func(2)
     └─ func(1)
         └─ func(0)

그래서 매개변수 n도 호출마다 따로 존재


재귀 문제에서 자주 터지는 함정

종료 조건이 없는 경우

int func(int n) {
    return func(n - 1);
}

끝나는 시점이 없어서 무한 호출


값이 줄어들지 않는 경우

int func(int n) {
    if (n == 0) {
        return 0;
    }

    return func(n);
}

n이 계속 그대로라 종료 조건인 n == 0에 도달하지 못함.


n-- 함정

int func(int n) {
    if (n == 0) {
        return 0;
    }

    return func(n--);
}

이건 위험해.

n--은 현재 n 값을 먼저 넘긴 뒤 감소

즉 func(3)이면 재귀 호출에는 여전히 3이 들어간다는 의미 

func(3)
→ func(3)
→ func(3)
→ ...

 

아래는 괜찮음

return func(n - 1);

또는

return func(--n);

 


 

연습문제

문제 1

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 3;
    int y = 5;

    printf("%d", add(x, y));
    return 0;
}

 

답 : 8


문제 2

#include <stdio.h>

void change(int x) {
    x = x + 10;
}

int main() {
    int n = 5;

    change(n);
    printf("%d", n);

    return 0;
}

 

답 : 5 (함수 안에서 n이 x로 복사됨)


문제 3

#include <stdio.h>

int sum(int n) {
    if (n == 0) {
        return 0;
    }

    return n + sum(n - 1);
}

int main() {
    printf("%d", sum(3));
    return 0;
}

 

답 : 6

 


문제 4

#include <stdio.h>

int func(int n) {
    if (n <= 1) {
        return 1;
    }

    return func(n - 1) + func(n - 2);
}

int main() {
    printf("%d", func(5));
    return 0;
}

 

답 : 8

 


문제 5

#include <stdio.h>

void printNum(int n) {
    if (n == 0) {
        return;
    }

    printf("%d ", n);
    printNum(n - 1);
    printf("%d ", n);
}

int main() {
    printNum(3);
    return 0;
}

 

답 : 3 2 1 1 2 3