함수의 선언과 정의
//함수의 선언
반환값 자료형 함수명(매개변수1 자료형 매개변수명1, 매개변수2 자료형 매개변수명2);
int main(){
}
//함수의 정의
반환값 자료형 함수명(매개변수1 자료형 매개변수명1, 매개변수2 자료형 매개변수명2){
//함수가 수행하는 명령
}
예시
int sum(int a, int b){
int res;
res = a + b;
return res;
}
sum(10, 20); //30
여러가지 함수 유형
1. 매개 변수가 없는 함수
//양수를 출력하는 함수
int get_pos(){
int num;
scanf("%d", &num);
if(num < 0){
printf("양수를 입력해주세요.");
scanf("%d", &num);
}
return num;
}
//호출
int pos;
pos = get_pos();
2. 반환 값이 없는 함수
: 화면에 출력을 하는 경우 등등
//반복되는 문자 출력
print_char(char ch, int cnt){
int i;
for(i=0; i<cnt; i++){
printf("%c", ch);
}
}
//만약 리턴을 쓰고싶다면 아무 값 없이 return만 사용
//호출
print_char('*', 5);
3. 매개 변수와 반환 값이 없는 함수
//반복되는 문자 출력
print_bar(){
int i;
for(i=0; i<5; i++){
printf("-");
}
}
//만약 리턴을 쓰고싶다면 아무 값 없이 return만 사용
//호출
print_char('*', 5);
재귀함수
: 자기가 자기 자신을 호출하는 함수
fruit(){
printf("apple\\n")
fruit(); //자기자신 호출
}
위의 함수를 실제로 실행하면 강제종료된다.
그 이유는 첫 fruit() 반환 되지 않고 두 번째 fruit() 생기고 또 반환이 않되는 일이 무한대로 벌어지기 때문이다.
따라서 재귀함수에는 그 호출을 중지할 조건이 필요하다.
void fruit(int cnt){
printf("apple\\n");
if (cnt == 3){
return;
}
fruit(cnt+1); //자기자신 호출
printf("jam\\n");
}
//호출
fruit(1);
재귀함수의 작동원리
void fruit(1){
printf("apple\\n");
if (cnt == 3){
return;
}
fruit(cnt+1); //자기자신 호출1
printf("jam\\n");
}
1. 우선 첫 번째로 fruit재귀함수를 호출하면 apple을 출력 후 두 번째 fruit재귀함수를 호출한다. (jam은 출력하지 않음 -> 호출 보다 아래이기 때문에)
void fruit(2){
printf("apple\\n");
if (cnt == 3){
return;
}
fruit(cnt+1); //자기자신 호출2
printf("jam\\n");
}
2. 두 번째 fruit재귀함수를 호출되면 apple을 출력 후 세 번째 fruit재귀함수를 호출한다. (jam은 출력하지 않음 -> 호출 보다 아래이기 때문에)
void fruit(3){
printf("apple\\n");
if (cnt == 3){
return;
}
fruit(cnt+1); //자기자신 호출3
printf("jam\\n");
}
3. 세 번째 fruit재귀함수가 호출되면 apple을 출력 후 반환된다. 이때 반환은 값으로 반환하는 것이 아니라 해당 함수를 호출했던 곳으로 반환 된다.
따라서 이때 반환 되는 곳은 주석으로 처리된 자기 자신 호출2로 반환된다. 그 후 jam을 출력하고 다시 해당 함수를 호출한 첫 자기 자신 호출1로 반환된다. 여기서 다시 한번 jam을 출력하고 함수가 종료된다.
//결과
apple
apple
apple
jam
jam
재귀함수가 이해 안될 떄 추천 영상 -> https://youtu.be/_-JPk12J2Zg?feature=shared
'문법관련 > C' 카테고리의 다른 글
10. 배열과 포인터 (0) | 2024.06.24 |
---|---|
9. 포인터 (0) | 2024.06.18 |
7. 반복문 - do while (0) | 2024.06.13 |
6. 연산자 (0) | 2024.06.12 |
5. scanf 함수 (1) | 2024.06.10 |