Fibonacci 구현방법 3가지의 차이점은?(시간복잡도등)

2020-04-12

해당 Post는 Fibonacci 구현방법 3가지의 차이점을 정리한 파일입니다.


Fibonacci 수열

첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다.

  • 반환형을 double로 바꾸는 것을 추천 -> 50 이상의 수열에서는 int형 범위 초과

1. 재귀(recursion)

  • O(2^n)
  • 연속 함수 호출로 인한 stack overflow 문제 발생 가능성 높음
    int fibonacci(int x){ 
      if(x <= 2){
          return 1; 
      } 
      return fibonacci(x-1) + fibonacci(x-2); }
    

2. 동적 프로그래밍(Dynamic Programming)

  • O(n)
    int fibonacci(int n) {
      int arr[MAX_SIZE];
      if(n < 2) return n;
      if(arr[n] > 0) return arr[n];
      else return arr[n] = fibonacci(n-1) + fibonacci(n-2);
    }
    
  • 연속 함수 호출로 인한 stack overflow 문제 발생 가능성 높음
  • 메모이제이션을 통해 동일한 계산이 반복되는 것을 방지
  • 계산된 값을 저장할 테이블 존재

3. 반복문(for 문)

  • O(n)
    int fibonacci(int n) {
      if(n < 2) return n;
      else {
          int i, tmp, cur = 1, last = 0;
          for (i = 2; i <= n; i++) {
              tmp = cur;
              cur += last;
              last = tmp;
          }
          return cur;
      }
    }
    
  • 메모이제이션을 통해 동일한 계산이 반복되는 것을 방지
  • 계산된 값을 저장할 테이블 존재