最近在看高德纳的<<计算机程序设计艺术>>,其中看到了斐波那契序列。 用代码实现序列非常简单,程序如下:
public static int x(int a) {
if (a <= 0) {
return 0;
}
switch (a) {
case 1:
return 1;
default:
return x(a - 2) + x(a - 1);
}
}
运行程序,序列数据执行也没有问题,然而,将a值设定为50以上之后,发现运行速度非常慢。原因是在递归调用的过程中,大量的重复计算。因为是重复计算,那么就可以通过保存每次计算的结果,来过滤重复计算的问题。程序实现如下:
public static int x2(int a ,Map<Integer,Integer> map){
int result = 0;
if (a >= 0) {
switch (a) {
case 0:
map.put(0, 0);
break;
case 1:
result = 1;
map.put(1, 1);
break;
default:
if(map.isEmpty()){
result = x2(a-1,map)+x2(a-2,map);
map.put(a, result);
}else{
result=map.get(a-1)+map.get(a-2);
}
}
}
return result;
}
以上优化,虽然解决的运行缓慢的问题,但是,带来的问题就是需要O(N)的空间消耗。
查看整个序列,实际上 表达式为 f(x) = f(x-1)+f(x-2) (x>1),因此,我们可以用两个空间来存放f(x-1)和f(x-2)的数值,就能满足序列的执行,附带的空间消耗也将变为O(2)
代码实现如下:
private static int next;
private static int current;
public static int x1(int a) {
int result = 0;
if (a > 0) {
switch (a) {
case 0:
break;
case 1:
result = 1;
break;
default:
result = x1(a - 1) + next;
}
next = current;
current = result;
}
return result;
}