斐波那契序列程序优化

来源:互联网 发布:鳄鱼毒品知乎 编辑:程序博客网 时间:2024/05/01 15:49


    最近在看高德纳的<<计算机程序设计艺术>>,其中看到了斐波那契序列。 用代码实现序列非常简单,程序如下:

        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;
}

 

 

0 0
原创粉丝点击