[혼공C] 4주

자경·2024년 7월 24일
0

혼공C

목록 보기
3/4
post-thumbnail
  1. 함수란 무엇인가
  2. 함수의 종류
  3. my love🌹_ 재귀함수recursive call fn

안녕하세요
인용문을 넣으면 좋을거같아서 넣어보았습니다.


함수?

😘함수의 3단계

  • 함수 정의 : 함수에 대한 내용을 정의하는 것
  • 함수 선언 : 함수 사용을 컴파일러에게 알리기 위해 전처리기나 main,특정 함수 안에 쓰는 것
  • 함수 호출 : 함수를 사용하기 위해 부르는 것, 매개변수라고 불리는 값을 괄호 안에 넣어 전달한다

*함수 선언에 경우, 함수 정의를 상단에 하는 경우 생략이 가능하다.
*함수 호출에서는 인자, 함수 정의 시 사용되는 변수를 매개변수라 부르나 보통 섞어서 쓰기도 한다.


&예시&

#include <stdio.h>

int add(int, int); //1.함수 선언 : 인자에 대한 변수는 생략가능

int main(){
	int a = 1;
    int b = 2;
    
    printf("%d",add(a,b)); //2.함수 호출 : 인자값 전달
    
    return 0;
}

int add(int n,int m){ //3.함수 정의 : return값은 하나만 가능하다
	return n+m;
}
  1. == int add(int n, int m); ++ 함수 원형을 작성.
  2. return 값이 있을 수도 있으며 없을 수도 있다.
  3. main()에서 온 인자값은 add()의 지역변수 n,m으로 값이 복제된다.

함수의 종류💖

1. return 값이 없는 함수

#include <stdio.h>

void apple_cnt(int); //void:데이터없음.

int main(){
	int a = 1;
    apple_cnt(1);
    return 0;
}
void apple_cnt(int a){
	printf("I have %d apples",a);
    return; //작업을 끝내길 원할때 언제나 끝낼 수 있다. 
}

return 값이 없어도되나 값을 필요로 하는 출력에 사용될 수 있다.


2. 매개변수가 없는 함수

#include <stdio.h>

int scan(void);

int main(){
	int a[3];
    
    //함수 호출&배열에 각 값을 할당
    for(int i=0; i<3; i++){
    	printf("%d index방 입력 : ",i);
    	a[i] = scan(); //void는 호출시 사용x
        
    return 0;
    }
    
    //전체 출력 
    for(int i=0; i<3; i++)
    	printf("%d ,a[i]");
}
int scan(void){
	int a;
	scanf("%d",&a);
    return a;
}

매개값이 필요없을 때 주로 사용한다.


3. return도, 매개변수도 없는 함수

#include <stdio.h>

void hello(void);

int main(){
	printf("지금부터 인사 10번 해볼게요 얍!");
    
    for(int i=0; i<10; i++)
    	hello();
        
    return 0;
}
void hello(void){
	printf("Hello!\n");
}

단순 출력에 사용되었다.



재귀호출 함수

자기 자신을 호출해서 사용 후, 조건문을 통해 빠져나온다.


WhY? 왜 이렇게는 실행이 안될까? 🫥😢 그동안 그냥 혹은 빨리 넘기며, 왜 인지는 생각을 안해보았다.
#include <stdio.h>

void apple(void);

int main(){
	apple();
    return 0;
}
void apple(void){
    printf("apple\n");
    apple();
}

문제점 분석
1. '재귀'함수이기에, 자신을 계속 부르게된다. -> 끝없는 루프가 이어진다.
2. 위의 코드로는 재귀 함수의 종료 조건을 걸 수 없다.
3. 재귀가 깊고 많아져서 스택 메모리가 초과되는 현상이다. -> 오류 발생 가능성
*스택 메모리- 함수 호출 마다 정보가 쌓이는 메모리.


apple을 10번 출력하는 재귀호출 함수
#include <stdio.h>

void apple(int);

int main(){
	apple(1);
}
void apple(int cnt){
	if(cnt>10) return 0; //종료를 의미 
    printf("apple\n");
    cnt++;
    apple(cnt+1);
}

개선 1. 매개변수에 시작하는 수를 넣어주며 cnt를 할 수 있도록 하였다. 전달된 값은 stack memory에 쌓인 채로 존재한다. 2. apple(cnt)로 쓰면 값의 증가가 일어나지 않아 계속 apple(1)인 상태로 재귀를 한다. 3. if문을 넣어 cnt가 조건을 넘으면 종료를 하도록 하였다.

다음엔 꼬리재귀에 대해서도 알아보고 싶습니다.
헤야할 일
-어떻게 컴파일 최적화가 이루어지는지
-어떤 과정인지
-알고리즘 별로 어떻게 달라지는지

0개의 댓글