2.Fibonacci수열
1)피보나치수열-이전 데이터를 가지고 다음 데이터를 만들어내는 수열
==>첫번째와 두번째 데이터는 무조건 1
그러니 반복문을 돌릴 때 두개는 예외로, 세번째부터 돌려야 한다
==>세번째 부터는 앞의 2개 항의 합
1,1,2,3,5,8,13,21,34,55
2)재귀를 이용한 해결-시간이 오래 걸리지만 이해하기는 쉬움
3)재귀를 이용하지 않고 해결-시간을 단축할 수 있지만 이해하기가 어려울 수 있음
상황에 따라 2)3)선택. 내게 주어진 메모리제한과 시간제한을 고려할 것
재귀
package java_1025;
public class RecursionFibonacci {
//재귀를 만들 때는 말하는거 그대로 만든다고 생각
//n번째 피보나치 수열의 값을 리턴해주는 메서드
public static int fibonacci(int n) {
//첫번째와 두번째는 1
if(n==1||n==2) {
return 1;
}
//세번째 부터는 앞의 두개 항의 합
else {
return fibonacci(n-1)+fibonacci(n-2);
}
}
public static void main(String[] args) {
long start=System.currentTimeMillis();
System.out.println(fibonacci(45));
long end=System.currentTimeMillis();
System.out.println((end-start)*0.001);
//수가 늘어날수록 시간이 엄청 오래 걸린다
}
}
1134903170
3.5820000000000003
재귀메서드를 어렵게 생각하지 말고, 내가 하려는 걸 그대로 옮긴다고 생각하면 된다. 앞에거 두개를 더할 거니 메서드가 리턴하는 값의 앞과 그 앞인 n-1과 n-2를 더하면 됨.
재귀x
package java_1025;
public class NonRecursionFibonacci {
// n번ㅉ 피보나치 수열의 값을 리턴해주는 메서드
public static Long fibonacci(int n) {
Long f1=(long)1;
Long f2=(long)1;
//피보나치 값을 저장할 변수
Long fibo=(long)1;
//첫번째와 두번째는 처리할 필요 없다. 반복문을 세번째 부터 적용
for(int i=3;i<=n;i++) {
fibo=f1+f2;
f2=f1;
f1=fibo;
//이 과정은 다음을 준비하는 과정임.
}
return fibo;
}
public static void main(String[] args) {
System.out.println(fibonacci(100));//int를 쓰면 int의 범위를 넘어 음수가 나옴
}
}
3736710778780434371
값을 변경해주는 과정이 필요함. 피보나치수열은 앞의 두개를 더하는 값이 연속되므로 계산이 끝난 값을 계속해서 변수에 저장해주기.
tip)주석을 자주 다는 습관을 가질 것
'JAVA' 카테고리의 다른 글
221025 랜덤 (0) | 2022.10.25 |
---|---|
221025 날짜 (0) | 2022.10.25 |
221025 binarySearch (0) | 2022.10.25 |
221024 Array 검색(Search) (0) | 2022.10.24 |
221024 Array클래스, compareTO(), Comparable 인터페이스 (0) | 2022.10.24 |