import java.util.concurrent.atomic.AtomicInteger;
/**
* 斐波那锲,带缓存和不带缓存区别太大了
* @author Administrator
*
*/
public class Fibonacci {
public static AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args) {
// -- 1,1,2,3,5,8,13,21,34
int n = 40;
// 缓存
long arr[] = new long[n+1];
long start = System.currentTimeMillis();
System.err.println("value1:f(n, arr)=" + f(n, arr));
System.out.println("耗时1:" + (System.currentTimeMillis()-start) + " f调用次数:" + counter.intValue());
counter.set(0);
start = System.currentTimeMillis();
System.err.println("value2:f(n)=" + f(n));
System.out.println("耗时2:" + (System.currentTimeMillis()-start) + " f调用次数:" + counter.intValue());
}
// 带缓存
public static long f(int n, long arr[]) {
counter.getAndIncrement();
if (n == 1 || n == 2) {
arr[n] = 1;
return 1;
} else {
arr[n] = arr[n]> 0? arr[n]:arr[n-1] + arr[n-2];
return (arr[n-1] > 0? arr[n-1]:f(n - 1, arr)) + (arr[n-2] > 0? arr[n-2]:f(n - 2, arr));
}
}
/**
*不带缓存
* @param n
* @return
*/
public static long f(int n) {
counter.getAndIncrement();
if (n == 1 || n == 2) {
return 1;
} else {
return f(n - 1) +f(n - 2);
}
}
}
执行结果:
value1:f(n, arr)=102334155
耗时1:0 f调用次数:76
value2:f(n)=102334155
耗时2:2657 f调用次数:204668309
总结:差距特别大,论算法的重要性