반응형
Notice
Recent Posts
«   2024/09   »
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
Today
Total
관리 메뉴

H-Log

[알고리즘] 피보나찌 수 구하기 본문

dev-log/cs

[알고리즘] 피보나찌 수 구하기

hong6v6 2023. 10. 20. 23:56
반응형

피보나찌 수 구하기

피보니찌

  • 재귀 함수의 한계를 설명하기 좋음
  • n(n ≥ 2)의 피보나찌 = (n-2) + (n-1)

1. 재귀적 방법으로 피보나찌 수 구하기

  • n-1과 n-2의 값이 1 또는 0이 될 때 까지 fib 함수가 재귀적으로 호출된다.
int fib(int n) {
	if (n <= 1)
		return n;
	else
		return(fib(n-1)+fib(n-2));
}

 

  • fib(5)를 계산 ⇒ fib(2)는 3번 중복계산, fib(1)는 5번 중복계산 …
  • 같은 수를 중복 계산 ⇒ 비효율적!

fib(n)의 함수 호출 횟수 계산

  • T(n) : fib(n)을 계산하기 위하여 fib 함수를 호출하는 횟수 즉, 재귀 트리 상의 노드의 개수
T(n) = T(n - 1) + T(n - 2) +1 (for n ≥ 2)
> 2 x T(n - 2)         → 왜냐하면 T(n - 1) > T(n - 2) 
> 2^2 x T(n - 4)
> 2^3 x T(n - 6)
…
2n/2 x T(n-n) = 2n/2xT(0) = 2^n/2

결론

재귀적 알고리즘으로 구성한 재귀 트리의 노드 수를 T(n)이라 하면, n2인 모든 n에 대하여 T(n)> 2n/2 이다. ⇒ 매우 느림

이유: 같은 피보나찌 수를 중복 계산

2. 반복적 방법으로 피보나찌 수 구하기

int fib2 (int n) 
{ index i;
	int f[0..n];
	f[0]=0;
	if (n>0) 
	{
		f[1]=1;
		for (i=2; i<=n; i++)
			f[i]= f[i-1]+f[i-2];
	}
	return f[n];
}

반복 알고리즘에서 계산하는 항의 총 개수

T(n) = n + 1 

즉, f[0]부터 f[n]까지 한번씩 만 계산

결론

피보나찌 수 문제에서 반복 알고리즘은 재귀 알고리즘보다 수행속도가 훨씬 더 빠르다.
이유: 중복 계산이 없음

 

반응형

'dev-log > cs' 카테고리의 다른 글

[알고리즘] 점근적 표기 Big-Oh  (0) 2023.10.21
[알고리즘] 시간 복잡도  (0) 2023.10.20
[알고리즘] 순차탐색 / 이분탐색  (0) 2023.10.20
[알고리즘] 알고리즘이란  (0) 2023.10.20
[운영체제] 네트워크  (0) 2023.10.01
Comments