안선생의 개발 블로그

재귀의 정적변수 본문

알고리즘

재귀의 정적변수

안선생 2022. 9. 26. 13:45

일반재귀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
 
using namespace std;
int fun(int n)
{
    if (n > 0)
    {    
        return fun(n - 1)+n;
        
    }
    return 0;
}
int main()
{
    int x;
    x=fun(5);
    cout << x;
    
    return 0;
}
cs

fun(4)+n -> fun(3)+n ->fun(2) +n-> fun(1)+n ->fun(0)+n 조건문에 걸려서 반대로 올라간다.

n은 1부터 시작해서 올라간다.

fun(0) = 0+1 = 1 

fun(1) = 1 +2 = 3

fun(2) = 3 +3 = 6

fun(3) = 6 +4 = 10

fun(4) = 10 +5 = 15

fun(5) = 15 

결과값은 15가 나온다.

 

 

 

정적변수를 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
 
using namespace std;
int fun(int n)
{
    static int a = 0;
    if (n > 0)
    {    
        a++;
        return fun(n - 1)+a;
        
    }
    return 0;
}
int main()
{
    int x;
    x=fun(5);
    cout << x;    
    return 0;
}
cs

이것도 마찬가지로 fun(4)+n -> fun(3)+n ->fun(2) +n-> fun(1)+n ->fun(0)+n 조건문에 걸려서 반대로 올라간다.

정적변수 a는 함수가 호출되면 한번만 생성됩니다. 따라서 a는 여러 복사본이 없으므로 실행을 하면

1->2->3->4->5 a는 5를 갖게됩니다.

fun(0) = 0+5 = 5

fun(1) = 5 +5 = 10

fun(2) = 10 +5 = 15

fun(3) = 15+5 = 20

fun(4) = 20 +5 = 25

fun(5) = 25 

결과값은 25가 나온다. 

 

일반 재귀함수는 함수가 호출되면 복사본이 계속 호출되서 n값이 점점올라가지만 정적변수를 이용한 재귀는 복사본이 없어 a값은 마지막 값을 갖게되고 쭉 그값을 유지합니다. 정적변수랑 마찬가지로 전역변수도 동일합니다.

'알고리즘' 카테고리의 다른 글

C++ 문자열 Anagram  (0) 2022.10.11
배열 ADT  (0) 2022.10.09
하노이 탑  (0) 2022.10.01
피보나치 3가지 방법  (0) 2022.09.29
재귀 함수  (1) 2022.09.25