피보나치

문제

1) 피보나치 수열을 출력한다. 피보나치 수열이란 앞의 2개의 수를 합하여 다음 숫자가 되는 수열이다. 2) 입력은 피보나치 수열의 총 항의 수 이다. 만약 7이 입력되면 1 1 2 3 5 8 13을 출력하면 된다.

입력

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

출력

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

입력예제

10

출력예제

1 1 2 3 5 8 13 21 34 55

해결방법

  • 메모이제이션 : 순간순간 기록하는 것.
  • 재귀 함수는 함수 호출 시 마다 스택프레임이 생성되기 때문에 단일 함수 내 반복문으로 수행하는 것보다는 성능(속도)이 떨어진다.

코드

  • 작은 수 부터 순서대로 호출하여 구하기
import java.util.*;

class Main {
    public int DFS(int n) {
        if (n == 1) return 1;
        else if (n == 2) return 1;
        else return DFS(n - 2) + DFS(n - 1);
    }

    public static void main(String[] args) {
        Main.Main T = new Main.Main();
        int n = 10;
        for (int i = 1; i <= n; i++) System.out.print(T.DFS(i) + " ");
    }
}
  • 큰 수 부터 역순으로 호출하여 구하기
import java.util.*;

class Main {
    static int[] fibo;

    public int DFS(int n) {
        // n 번째 값이 존재 한다면 그 값을 리턴한다.
        if (fibo[n] > 0) return fibo[n];
        // n 이 1이라면 1을 리턴한다. 피보나치 수열은 앞의 2개가 있어야 계산할 수 있다.
        if (n == 1) return fibo[n] = 1;
        // n 이 2라면 1을 리턴한다. 피보나치 수열은 앞의 2개가 있어야 계산할 수 있다.
        else if (n == 2) return fibo[n] = 1;
        // 그 외의 경우에 n 번째 배열의 값은 n - 2 번째와 n - 1 번째 값이다.
        // 단, 최대 수 부터 역순으로 찾기 떄문에 .. 빼는 것으로 구한다.
        else return fibo[n] = DFS(n - 2) + DFS(n - 1);
    }

    public static void main(String[] args) {
        Main.Main T = new Main.Main();
        int n = 45;
        fibo = new int[n + 1];
        T.DFS(n);
        for (int i = 1; i <= n; i++) System.out.print(fibo[i] + " ");
    }
}


© 2024. Chiptune93 All rights reserved.