두 가지 방법으로 fibonachi 행을 계산합니다. 왜 fib1이 fib2보다 훨씬 오래 실행됩니까?두 가지 다른 재귀 방법
public class RecursionTest {
@Test
public void fib1() {
long t = System.currentTimeMillis();
long fib = fib1(47);
System.out.println(fib + " Completed fib1 in:" + (System.currentTimeMillis() - t));
t = System.currentTimeMillis();
fib = fib2(47);
System.out.println(fib + " Completed fib2 in:" + (System.currentTimeMillis() - t));
}
long fib1(int n) {
if (n == 0 || n == 1) {
return n;
} else {
return fib1(n - 1) + fib1(n - 2);
}
}
long fib2(int n) {
return n == 0 ? 0 : fib2x(n, 0, 1);
}
long fib2x(int n, long p0, long p1) {
return n == 1 ? p1 : fib2x(n - 1, p1, p0 + p1);
}
}
출력 : 이유는 두 개의 알고리즘이 다른 런타임 복잡성이있다
2971215073 Completed fib1 in:17414
2971215073 Completed fib2 in:0
디버거를 사용하여 디버깅 과정을 단계별로 실행해야합니다.하지만 첫 번째 기법은 1025119359 메서드 호출을 호출하고 두 번째 기법 호출은 47 번만 호출합니다. –
그래, 그 알고리즘은 완전히 다릅니다. 다른 하나는'O (n)'에 있습니다. –
그리고 더 빠른 알고리즘이 있습니다 : [여기는 C++로 작성했습니다] (http://ideone.com/dQtVl) –