CS/알고리즘
알고리즘 - 피보나치 구현 방식
빈둥벤둥
2021. 3. 2. 18:32
알고리즘 - 피보나치 구현 방식
피보나치란?
-
첫째항 및 둘째항은 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다.
- 0번째 항부터 시작할 경우 점화식으로 나타내면 다음과 같다
- f(n) = f(n - 1) + f(n - 2) (이때, n > 1)
피보나치 - 재귀함수로 구현 with JAVA
public static int fibo(int n) {
if(n <= 1) return n;
else return fibo(n - 1) + fibo(n - 2);
}
- fibo(n - 1) + fibo(n - 2)를 진행할 때 같은 수를 중복적으로 호출하는 현상이 발생한다.
- 시간복잡도는 O(2^N)이 된다.
피보나치 - 반복문으로 구현 with JAVA (Dynamic Programming)
int[] fibo = new int[n + 1];
fibo[0] = 0;
fibo[1] = 1;
for(int i = 2; i <= n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
}
return fibo[n];
- 동적 계획법이라고도 하며, bottom-up 방식으로 n번만큼 반복하게 된다. 이전에 계산한 값을 가지고 계산을 축적해 나가므로 이미 계산한 값을 다시 계산하는 과정이 발생하지 않는다.
- 시간복잡도는 O(n)이 된다.
피보나치 - 재귀함수와 메모이제이션으로 구현 with JAVA
public static int fibo(int n, int[] memo) {
if(memo[n] > 0) return memo[n];
if(n <= 1) return n;
return memo[n] = fibo(n - 1, memo) + fibo(n - 2, memo);
}
- 재귀함수 방법에서 중복된 함수가 여러번 호출되는 것을 막기 위해 이전에 계산한 값을 저장한다. 현재 구하려는 값이 이미 계산된 값이라면 그 값을 반환하여 중복 계산을 막는다.
- 메모이제이션은 동적 계획법의 일종으로 보기도 하며, top-down 방식으로 실제로 필요한 subproblem만을 풀 수 있다.
- 시간복잡도는 O(n)이다.
reference
ko.wikipedia.org/wiki/%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98_%EC%88%98