0313 코드리뷰 Q3. 피보나치 수열 출력하기
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문을 사용한 게 독특해서 가져왔다
▶ 아직 코린이라 코드가 무조건 짧아야 좋은 건지 아닌지 잘 모르겠지만, 한 문제를 푸는 다양한 방법을 일단 기록해 놓고 싶다. 나중에 좀 더 머리가 굵어지면 코멘트를 더 달 수 있지 않을까...