안선생의 개발 블로그
재귀의 정적변수 본문
일반재귀
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 |