알고리즘(C++) - 피보나치 수열

2022. 4. 19. 21:34· Skils/Algorithm
목차
  1. 피보나치수열:

피보나치수열:

첫째항은 0 둘째 항이 1이며 그다음 항부터는 바로 앞 두항의 합이다.

ex) 0,1,1,2,3,5,8,13,21,34,55,89 ㆍㆍㆍㆍㆍㆍ

 

#include <iostream>
#include <vector>
using namespace std;
int fibo(int n);
int main()
{
int n;
cin >> n;
cout << fibo(n);
}
int fibo(int n)
{
int result;
if (n < 2) //F[0]=0, F[1]=1 저장
{
return n;
}
else
{
result= fibo(n - 1) + fibo(n - 2); //F[n]=F[n-1]+F[n-2]
}
return result;
}

재귀로 만든 피보나치 수열이다.

이 코드는 비효율적인 코드이다. 왜 일까?

재귀로 만든 피보나치의 시간 복잡도는 exponentially하다.

→그냥 안 좋다는 뜻이다.

왜 비효율적일까?

이유는 재귀를 사용해서 피보나치수열을 계산하면 중복된 계산이 있다는 점이다.

예를 들어

  1. F(4)를 구하기 위해서는 F(3)과 F(2)가 필요하다.
  2. F(3)을 구하기 위해서는 F(2)과 F(1)이 필요하다.
  3. F(2)를 구하기 위해서는 F(1)과 F(0)이 필요하다.

여기서 중복계산은 몇 번 일어날까?

재귀로 푼다면 F(3)을 구하는데 fibo(2), fibo(1), fibo(0)이 호출됐다.

F(2)를 구하는데 fibo(2), fibo(1), fibo(0)이 호출됐다.

피보나치를 재귀적으로 푼다면 필연적으로 중복계산이 일어날 수밖에 없다.

그러면 이러한 피보나치수열을 구할 때 어떻게 하면 더 효율적으로 짤 수 있을까?

 

만약 F(n)을 구하고 F(n)이 필요할 때 꺼내서 쓴다면

→ 중복 계산을 피할 수 있을 것이다.

이렇게 계산을 하고 계산 값을 저장해서 필요할 때 꺼내서 쓰는 것을 memoization이라고 한다.

#include <iostream>
#include <vector>
using namespace std;
int fibo(int n);
vector<int>F;
int main()
{
int n;
cin >> n;
cout << fibo(n);
}
int fibo(int n)
{
int result;
F.push_back(0); //F[0]=0
F.push_back(1); //F[1]=1
if (n < 2) //F[0]=0, F[1]=1 저장
{
return n;
}
else
{
for (int i = 2; i <= n; i++)
{
F.push_back(F[i - 1] + F[i - 2]);
//F[i-1],F[i-2]를 다시 계산하지 않고 저장된 값을 꺼내서 씀.
}
}
return F[n];
}

이처럼 알고리즘을 구현할 때는 시간 복잡도와 공간 복잡도를 고려해서 효율적으로 짜는 것이 중요하다.

시간 복잡도와 공간 복잡도는 다음에 할 것이다.

 

출처:대학교 강의자료,알고리즘 기초 교재

'Skils > Algorithm' 카테고리의 다른 글

[C++]-백트래킹(Backtracking)이란? + n-Queens문제  (0) 2022.05.06
알고리즘[C++] - 허프만 코드(Huffman Code )  (0) 2022.05.01
분할가능 배낭 문제(Fractional Knapsack Problem)-C++  (0) 2022.04.30
알고리즘 - Greedy (dead-line Scheduling Problem)  (0) 2022.04.29
알고리즘- 시간복잡도 분석(Time complexity Analysis)  (0) 2022.04.19
  1. 피보나치수열:
'Skils/Algorithm' 카테고리의 다른 글
  • 알고리즘[C++] - 허프만 코드(Huffman Code )
  • 분할가능 배낭 문제(Fractional Knapsack Problem)-C++
  • 알고리즘 - Greedy (dead-line Scheduling Problem)
  • 알고리즘- 시간복잡도 분석(Time complexity Analysis)
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (502) N
    • Skils (116) N
      • Android (50) N
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
알고리즘(C++) - 피보나치 수열
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.