Fibonacci를 구현하다보면 재귀를 사용하는 경우가 흔한 경우이다 하지만 재귀를 사용하면 중복되는 코드가 많이 발생하다보니 코드 수행시간이 길어진다. 이를 해결하기 위한 방법이 Dynamic Fibonacci이다.
재귀 Fibonacci
1 2 3 4 5 6 7 8 9 10 11 12 13
publicintfibonacci(int num){ int first = 0; int second = 1; int sum = 0; if(num <=2) { sum = first + second; }else { sum = fibonacci(num-1) + fibo(num-2); } return sum; }
Dynamic Fibonacci
Dynamic Fibonacci는 값을 지속적으로 저장하면서 코드를 실행한다 그러기 때문에 속도가 재귀보다 우수하다.
publicclassintfibonacci{ // long type을 사용하는 것이 중요하다. publiclongfibonacci(int num){ int answer = 0; int[] arr = newint[num + 1];
arr[0] = 0; arr[1] = 1; if (num <= 2) { answer = 1; } else { for (int i = 2; i <= num; i++) { arr[i] = arr[i-1] + arr[i-2]; } } answer = arr[num]; return answer; }
publicstaticvoidmain(String[] args){ intfibonacci c = new intfibonacci(); for (int i = 2; i <= 70; i++) { System.out.println(i + " " + c.fibonacci(i)); }
} }
하지만 여기서 또다른 issue사항이 발생한다 바로 int로 값을 표현하였기 때문에 표현할 수 있는 문자열의 한계가 존재한다 그래서 47번째 fibonacci부터 -값이 저장이된다.
값을 해결하기위하여 long type을 사용합니다.
int 표현범위 -2147483648 ~ 2147483647
long 표현범위 -9223372036854775808 ~ 9223372036854775807
publicclassfiboexample{ // long type을 사용하는 것이 중요하다. publiclongfibonacci(int num){ long answer = 0; long[] arr = newlong[num + 1];
arr[0] = 0; arr[1] = 1; if (num <= 2) { answer = 1; } else { for (int i = 2; i <= num; i++) { arr[i] = arr[i-1] + arr[i-2]; } } answer = arr[num]; return answer; }
publicstaticvoidmain(String[] args){ fiboexample c = new fiboexample(); for (int i = 2; i <= 65; i++) { System.out.println(i + " " + c.fibonacci(i)); }