算法之递归优化

一、什么是递归?

递归可以形象的理解为套娃,大规模待处理的数据可以分成很多小规模的数据用同样的方法解决,经过N多次小规模的处理后就可以得出大规模的解。递归是我们解决算法问题一个常用的方法,它可以极大的减少代码量,同时,递归可以和循环进行转换。递归是一种由少到多解决问题的办法。

二、递归的基本内容

递归主要有两个部分组成:
第一个是终止条件,终止条件控制的是递归何时停止,如果没有终止条件,递归将陷入死循环。
第二个是递归方法。递归方法也就是递归进行的方式,这个方法的主要工作是用相同的方法将大规模数据变成多个小规模数据的解。

三、递归优化

我们不难得出递归的本质是循环,既然是循环就面临着时间开销大的问题,尤其是递归层数较多的问题,这也成为了我们优化的着力点,那么我们该如何实现优化呢?简单进行有限步递归算法我们不难看出,递归存在重复计算的问题,比如;我们假设第n项是由第n-1项和第n-2项相加得到的,我们简单算个第五项需要先算第四项和第三项,第四项需要算第二项和第三项,第三项需要算第二项和第一项,可以发现,只是简简单单几步,第二项就被重复计算了,可想而知,但数据规模足够大时,重复计算的问题会更加严重。
我们的优化方式是将已经算过的项存储起来,下次再用的时候直接去取这一项就可以,而不需要从头再算一次,这样做就可以保证每个项无论大小都只会计算一次,通过map来存储这些项是一个不错的选择,也方便查找,通过项序号找到该项的值很容易。

四、map优化注意点

①map应该定义在递归方法之外,这样做是为了下次调用递归时上次的数据不被覆盖。
②在进行递归前要先判断所需项是否已经存在,若存在直接取出该项;若不存在,应该计算并存储该项。

五、优点分析

这样做以后,可以保证在一趟循环下得到所有项的数据,每一项被算过一次后就相当于静态存储了,而不会像原始递归那样被动态清除。还有一个好处是这样得到的数据在跳出递归后依然可以被我们利用。

六、其他联想

数组和map具有差不多的作用,那么可不可以用数组替换map呢?理论上该方法是可行的,但有一个前提条件是数据规模要已知,存储的数据不能超过范围。两者的主要区别其实就是数组是静态的,长度不可改变的;map是动态的,长度可以改变的。

七、优化实例

力扣第七十题:爬楼梯
力扣剑指offer第十题:斐波那契数列
这里给出爬楼梯问题的代码:
优化前代码(会超时):

class Solution {
    public int climbStairs(int n) {
            if (n==1) return 1;
            if (n==2) return 2;
                return climbStairs(n-1)+climbStairs(n-2);
        }
    }

优化后代码:

class Solution {
    Map<Integer,Integer> map=new HashMap();
    public int climbStairs(int n) {
            if (n==1) return 1;
            if (n==2) return 2;
            if(map.get(n)!=null){
                return map.get(n);
            }
               else{
               int sum=climbStairs(n-1)+climbStairs(n-2);
               map.put(n,sum);
               return sum;
               }      
        }
    }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值