티스토리 뷰

[49,50,51,52강] static 변수

* static 변수? (정적변수, 공유하고 있는 변수)

- 단 한번만 초기화하고, 그 이후에는 전역변수(함수 위에 선언해 모든 함수들이 공유)처럼 프로그램이 종료될때까지 메모리공간에 존재하는 변수.

- 초기값이 지정이 안되면, 자동으로 0 이 대입.

ex. int a; a에 이상한 쓰레기 값 들어감, static int a; 자동으로 a에 0값이 들어감

* 배열도 선언만 하면 자동으로 0이 들어감

지역 변수 static 변수
void test(){
  int a = 10;
  a++; // a=11
  printf("%d", a);
}

void main() {
  test(); // 11출력, 동작 수행 후 test 안의 변수들 초기화
  test(); // 11출력, 동작 수행 후 test 안의 변수들 초기화
}
void test(){
  static int a = 10; static이므로 초기화X(메모리에 남아있음)
  a++;  // a=11 → 12
  printf("%d", a);
}

void main() {
  test(); // 11출력
  test(); 12출력
}

 

* 예시

문제1 풀이
#include <stdio.h>
void funCount(); //니 밑에 funCount라는 함수가 있어~
int main(void){
  int num;
  for(num=0; num<2; num++)
     funCount();
  return 0;
}

void funCount(){
  int num = 0;
  static int count;
  printf("num=%d, count=%d\n", ++num, count++);
}
  for {
   num=0, 
    funCount(){
       num=0, static count,
       num=1, count=0 출력 후 count=1
    }
    num=1,
    funCount(){
       num=0, static count,
       num=1, count=1 출력 후 count=2
    }
    num=2, 종료
 }
문제2 풀이
#include <stdio.h>
int a = 10;
int b = 20;
int c = 30;

void main() {
  func();
  func();
  printf("a=%d, b=%d, c=%d\n", a,b,c);
}

void func(void){
  static int a =100;
  int b=200;
  a++;
  b++;
  c=a;
}
a=10
b=20
c=30 101 102
static a = 100 101 102
func() {
  static a= 100
  지역변수 b= 200
  a++; static a=101,
  b++; 지역변수 b=201
  **c는 함수 내 선언 안했으므로 전역변수 c=101,
}

func() {
  static a=101로 남아있음
  지역변수 b=200
  a++; static a=102,
  b++; 지역변수 b=201,
  전역변수 c = 102,
}

printf
→ 전역변수 a 10, 전역변수 b 20, 전역변수c 102출력

 

[53,54,55,56,57강] 재귀함수 (요즘 잘 안씀, 시험용으로 공부)

* 재귀함수란? 함수 내에서 자기의 함수를 다시 호출하는 함수

문제1 풀이
#include <stdio.>
int func(int num) {
  if(num == 1)
    return 1;
  else
    return num * func(num-1);
}

void main(){
  int i;
  for(i=5; i>=0; i--)
 {
    if(i%2 ==1)
        printf("func(%d) : %d\n", i, func(i));
  }
}
i=5, 5>=0, 5%2 = 1 → func(5) : 120출력

func(5) {
  5 != 1, return num*func(num-1) = 5*func(4) = 5*24= 120
}
func(4) {
  4 != 1, return num*func(num-1) = 4*func(3) = 6*4=24
}
func(3) {
  3 != 1, return num*func(num-1) = 3*func(2) = 3*2 =6
}
func(2) {
  2 != 1, return num*func(num-1) = 2*func(1) = 2*1=2
}
func(1) {
  1 == 1, return 1
}
i=5, 5>=0, 5%2 = 1 이므로 func(5): 120 출력
i=4, 4>=0, 4%2 !=1 이므로 출력 X
i=3, 3>=0, 3%2 =1 이므로 func(3): 6출력
i=2, 2>=0, 2%2 !=1 이므로 출력 X
i=1, 1>=0, 1%2 =1 이므로 func(1):1 출력
i=0, 0>=0, 0%2 !=1 이므로 출력 X
i=-1, -1>=0 거짓이므로 for문 빠져나옴
문제2 풀이
int result;
result = func(19);
printf("result==%d\n", result);

int func(int n){
  if(n%2 ==1)
     n=n-1;
  if(n==0) **** n%2=0아니고 n==0임, 문제 잘 읽기**
     return 0;
  return (func(n-2)+n);
}
func(19) {19%2 = 1, n= 19-1=18 return  func(16)+18}
72+18= 90
func(16) { 16%2!==1, 16!=0, return func(14)+16 }
56+16= 72
func(14) { 14%2 !==1, 14!=0, return func(12)+14}
42+14= 56
func(12) →func(10)+12= 30+12=42
func(10) →func(8)+10= 20+10=30
func(8) →func(6)+8= 12+8=20
func(6) →func(4)+6= 6+6=12
func(4) →func(2)+4= 2+4=6
func(2) →func(0)+2= 0+2=2
func(0) →n==0, return 0

result = 90 출력
문제3 풀이
#include <stdio.>
int recursion(int n){
  if(n<5) return 1;
else if (n%5 ==1)
  return n+ recursion(n-1);
 else recursion(n-1);
}

void main(){
  int n = recursion(16);
printf("%d",n)
}
recursion(16) {
16<5 거짓, 16%5 == 1 → 16+recursion(15)호출
=16+18=34리턴 
}
recursion(15) {
15<5 거짓, 15%5 == 1 거짓, recursion(14) = 18리턴
}
rec(14)→rec(13)→rec(12)→rec(11) = 18
recursion(11) {
11<5거짓, 11%5==1 → 11+recursion(10)=11+7=18 리턴
}
rec(10)→rec(9)→rec(8)→rec(7)→rec(6) =7
recursion(6) {
6<5거짓, 6%5==1 → 6+recursion(5) = 6+1=7 리턴 
}
rec(5)=1→rec(4)=1
recursion(4) {
4<5 → return 1

34출력

 

[58,59,60강] 중복 재귀함수

문제1 풀이
#include <stdio.>
int recur(int a, int b){
  if(a<=1)
    return a*b;
  else
    return a*recur(a-1, b+1)+recur(a-1,b);
    *자기가 자기호출하는게 2개있음
}

void main(){
  int a= 3, b=2;
  print("%d\n", recur(a,b));
}
a=3
b=2
recur(3,2) {
  3<=1거짓 → 3 * recur(2,3) + recur(2,2)=3*11+8=41
}
recur(2,3) {
  2<=1거짓 →  2 * recur(1,4) + recur(1,3)=2*4+3=11
}
recur(2,2) {
  2<=1거짓 2 * recur(1,3) + recur(1,2) = 2*3+2=8
}
recur(1,4) {
  1<=1 → 1*4=4
}
recur(1,3) {
  1<=1 → 1*3=3
}
recur(1,2) {
  1<=1 → 1*2=2
}
41 출력
문제2 풀이
#include<stdio.>
int fib(int n){
  if(n==0) return 0;
  if(n==1) return 1;
  return (fib(n-1)+fib(n-2));
}

void main(){
  fib(5);
}

*main()함수를 실행할 때 fib()함수가 호출되는 횟수는?
fib(5) = f(4)+f(3) = 3+2 = 5
fib(4) = f(3)+f(2) = 2+1 = 3
fib(3) = f(2)+f(1) = 1+1 = 2
fib(2) = f(1)+f(0) = 1+0 = 1
fib(1) = 1
fib(0) = 0

return 값은 5

*피라미드 그리면 쉬움 = 3+4+6+2=15번
                     (5) = (4) + (3) 3번
              (3)+(2)               (2)+(1) 4번
      (2)+(1)   (1)+(0)     (1)+(0)  6번   
   (1)+(0) 2번

 

※ 출처 : 흥달쌤 C언어 49강~60강 https://youtu.be/G_SIfsm00TU?si=XJSTDGBQYWpEyuDb

※ 컴파일 사이트 : http://ideone.com

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함