study/코드리뷰

0313 코드리뷰 Q3. 피보나치 수열 출력하기

달거북씨 2022. 3. 15. 17:01

Q3. 파라미터로 총 항의 수(n)를 받고, 입력한 총 항을 차례대로 출력하는 메소드를 만들어 보세요!

 

피보나치 수열이란? 
1,1,2,3,5,8,13,21,34,55,... 과 같이
1,1로 시작해서 앞의 두항의 합이 뒤의 항으로 이루어진 수열입니다.

 

예) fibonacci(10) 
출력결과 ->  1 1 2 3 5 8 13 21 34 55 (한 항씩 줄바꿈으로 출력)

 

 

 

A3-1. 달거북씨 코드

public class MKY_Fibonacci {

	public static void main(String[] args) {
		fibonacci(10);
	}

	public static void fibonacci(int n) {
		int a = 1, b = 1;	// a는 첫번째 숫자, b는 두번째 숫자로, 값은 1로 고정되어 있다.
		System.out.println("피보나치수열 출력결과");
		System.out.println(a);
		System.out.println(b);	// 처음 1이 두 번 나오는 걸 어떻게 해야할 지 몰라서 각각 출력문 사용
		for (int i = 3; i <= n; i++) {	// 세번째 숫자부터 반복문을 통해 출력
			int c = a+b;	// c는 세번째 숫자로 a와 b를 더한 값이다.
			System.out.println(c);
            
			// 세번째 숫자를 출력한 뒤 첫번째 자리와 두번째 자리가 바뀌므로 값 재할당			
			a = b;
			b = c;
		}
	}
}

▶ 수열 규칙을 찾아야 해서 인터넷의 도움을 빌렸다. 

▶ f(n) = f(n-1) + f(n-2) / (단 f(1) = 1, f(2) =1이다.)

▶ 세번째 숫자 = 첫번째 숫자 + 두번째 숫자

▶ 사실, 소스도 거의 긁어왔다ㅎ

 

 

 

A3-2. 다른 분 코드

public class CHH_Fibonacci {

	public static void main(String[] args) {
		fibonacci(10);
	}

	public static void fibonacci(int n) {
		int current = 1; 	// 현재 숫자
		int previous = 0;	// 이전 숫자
		int a = 0;		// 이전 숫자를 보관하는 변수
		
		
		for (int i = 1; i <= n; i++) {
			System.out.println(current);

			a = previous;
			previous = current;
			current = a + previous;
			
		}
	}
}

▶ 미세한 변화인데(아마도?) 조금 더 코드가 간결해졌다.

▶ 출력은 똑같이 세번째 숫자이지만 조금 더 앞에서부터 시작한다.

▶ 0, 0, 1, 1, 2, ...

▶ 이전 숫자에 0, 전전 숫자에 0을 부여함으로써 1을 따로 출력해주지 않아도 1부터 출력된다.

 

 

A3-3. 배열로 해결한 코드

package methodStudy;

public class JSH_Fibonacci {

	public static void main(String[] args) {
		 f1(10);
	}
	
    public static void f1(int x){
        int[] fibonacci = new int[x];
        fibonacci[0] = 1;
        fibonacci[1] = 1;
        System.out.print(fibonacci[0] + " " + fibonacci[1] + " ");
        
        for(int i = 2; i<x; i++){
            fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
            System.out.print(fibonacci[i] + " ");
        }
    }
}

▶ 배열 어렵다. 근데 배열이 좋은 것 같다.

▶ 배열을 사용하니 피보나치수열 공식(?)을 딱 사용할 수 있다. f(n) = f(n-1) + f(n-2) 

 

 

A3-4. 또 다른 분 코드

package methodStudy;

public class pjh_fibonacci {
	public static void main(String[] args) {
		
		for(int i = 1; i <= 10; i++) {	// for문을 통해 반복
			System.out.println(fibonacci(i));
		}
	}
	
	public static int fibonacci(int n) {	// if문을 사용해 1을 두번 출력하고 나머지 수열 로직 진행
		if(n == 1) {
			return 1;
		} else if(n == 2) {
			return 1;
		} else {
			return fibonacci(n - 1) + fibonacci(n - 2);
		}
	}
}

▶ 간결한 느낌은 아니지만 for문과 if문을 사용한 게 독특해서 가져왔다

▶ 아직 코린이라 코드가 무조건 짧아야 좋은 건지 아닌지 잘 모르겠지만, 한 문제를 푸는 다양한 방법을 일단 기록해 놓고 싶다. 나중에 좀 더 머리가 굵어지면 코멘트를 더 달 수 있지 않을까...

728x90