피보나치 수열(Fibonacci numbers) - 1

강성원·2024년 1월 15일
0
post-thumbnail

피보나치 수열

피보나치 수열은 다음과 같이 정의된다.

  • F0=0F_0 = 0
  • F1=1F_1 = 1
  • FN=FN1+FN2F_N = F_{N-1} + F_{N-2} (N=2,3,...)(N = 2,3,...)

NN이 3일 때
F3=F2+F1=(F1+F0)+F1=(1+0)+1F_3 = F_2 + F_1 = (F_1 + F_0) + F_1 = (1+0)+1
과 같은 재귀함수의 모양이 된다.

로직 구성

피보나치 수열에서 더 이상 나누어지지 않는 것은 F1F_1F0F_0이다.

피보나치 수열을 재귀함수로 생각하면 베이스 케이스가 되어 리턴을 시작하는 부분도 F1F_1F0F_0이다.

  • 베이스 케이스 = F1F_1, F0F_0
  • 베이스 케이스 만나기 전까지 하는 호출 = FN1+FN2F_{N-1} + F_{N-2}

위에 NN이 3일 때의 예시를 보면
F3F_3일땐 F2F_2F1F_1를 필요로 하고, F2F_2일땐 F1F_1F0F_0을 필요로 한다.

내가 말을 복잡하게 써놔서 난해할 수 있지만 코드를 보면 이해에 도움이 될 것이다.

구현

#include <iostream>
using namespace std;

int Fibo(int N)
{
    //베이스 케이스
    if (N == 0)
        return 0;
    else if (N == 1)
        return 1;

    return Fibo(N-1) + Fibo(N-2);
}

int main()
{
    cout << "Fibo(6) : " << Fibo(6)<< endl;
}
  • F1F_1F0F_0일땐 1과 0을 리턴해준다.
  • N이 2 이상의의 값일 땐 Fibo(N-1) + Fibo(N-2) (FN1+FN2F_{N-1} + F_{N-2}) 를 베이스 케이스 만나기 전까지 계속 호출해서 베이스 케이스에서 리턴 값을 받아낸다.

위와 같은 구현 방식은 같은 계산을 많이 반복하게 돼서 비효율적이다.
이런 부분을 보완하기 위해서 메모제이션 동적 계획법이 사용된다.
그 내용은 다음에..


참고 자료
오츠키 켄스케 , 『문제 해결력을 높이는 알고리즘과 자료구조, 서수환 옮김, 길벗(2022)

profile
개발은삼순이발

0개의 댓글