본문 바로가기
알고리즘 문제풀이 입문: 코딩테스트 대비/섹션 7. Recursive, Tree, Graph(DFS,BFS 기초)

피보나치 재귀 (메모이제이션)

by _비니_ 2024. 4. 29.

설명

1) 피보나치 수열을 출력한다. 피보나치 수열이란 앞의 2개의 수를 합하여 다음 숫자가 되는 수열이다.

2) 입력은 피보나치 수열의 총 항의 수이다. 만약 7이 입력되면 1 1 2 3 5 8 13을 출력하면 된다.

 

입력

첫 줄에 총 항수 N(3<=N<=45)이 입력된다.

 

출력

첫 줄에 피보나치 수열을 출력합니다.

 

예시 입력 1 

10

 

예시 출력 1

1 1 2 3 5 8 13 21 34 55

 

 

 

문제 해결

 

피보나치 수열은 1번째와 2번째항이 1이며, 그 이후의 각 항은 바로 앞 두 항의 합으로 구성된 수열이다.

1, 1, 2, 3, 5, 8, 13 ... 이런식으로 구성 된다.

 

n이 1과 2일 경우 1을 리턴하고

그 이후부터 FIBO(n-2) + FIBO(n-1) 를 반환하는 재귀함수로 풀어보았다.

 

하지만 피보나치 수열은 n이 커질수록 동일한 계산을 여러 번 반복하여 수행하기에 매우 비효율적이므로 배열하고 for문을 사용하는 게 훨씬 좋은 방법이다.

 

최종 코드

 

import java.util.Scanner;

public class P04_피보나치재귀_메모이제이션 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        for (int i = 1; i <= N; i++) {
            System.out.print(FIBO(i) + " ");
        }
    }

    public static int FIBO(int n) {
        if(n==1) return 1;
        else if (n==2) return 1;
        else return FIBO(n-2)+FIBO(n-1);
    }


}
반응형