【JAVA】(一丶)递归可能产生的问题及相关解决办法

(一)问题及解决方案
由于每一次递归的调用,都会创建新的栈帧,入栈出栈,当递归调用次数(深度)超过了JVM栈的极限的时候(理想的过程是,入栈->出栈,使用递归就变成了->入栈->入栈->入栈…不出问题才见了鬼了,而且,就算不出问题,递归深度太深的时候,也会导致运行速度很慢),就会产生StackOverFlow(据说也会产生OutOfMemory,理论上确实有可能【在递归方法中不断创建大对象】,目前还没遇到过)。如下代码:

public boolean haveAdminRight(KnowledgeCatalogy knowledgeCatalogy, UserSession user) {
    if(knowledgeCatalogy==null || user==null){
        return false;
    }
    Iterator iterator = knowledgeCatalogy.getAdmins().iterator();
    while (iterator.hasNext()) {
        User user1 = (User)iterator.next();
        if (user1.getId().intValue() == user.getId().intValue()) {
        knowledgeCatalogy.setCanIssue(1);
        return true;
        }
    }
    Integer pid=knowledgeCatalogy.getPid();
    if(pid==0){
        return false;
    }
    else{ //递归查找栏目权限
        KnowledgeCatalogy superCatalogy=this.getKnowledgeCatalogy(pid);
        return haveAdminRight(superCatalogy, user);
    }
}

既然如此,那我们只能放弃递归了,来,同样的代码,换一种思路,如下:

public boolean haveAdminRight(KnowledgeCatalogy knowledgeCatalogy, UserSession user) {
    if(knowledgeCatalogy==null || user==null){
        return false;
    }
    Integer pid = -1;
    KnowledgeCatalogy knowledgeCatalogyTemp = knowledgeCatalogy;

    while(pid != 0){
        Iterator iterator = knowledgeCatalogyTemp.getAdmins().iterator();
        while (iterator.hasNext()) {
            User user1 = (User)iterator.next();
            if (user1.getId().intValue() == user.getId().intValue()) {
            knowledgeCatalogyTemp.setCanIssue(1);
            return true;
        }
    }
    pid=knowledgeCatalogyTemp.getPid();
    knowledgeCatalogyTemp = this.getKnowledgeCatalogy(pid);
    }
    return false;
}

将递归转换成While循环,有效避免递归产生的问题。
以上是本次遇见的项目问题的解决方法,虽然问题解决了,但还远远不够。
(二)问题扩展
这让我想起来大学算法课上的一些东西(虽然大学上课不好好上,总归是有点印象,在此奉劝一句【敲黑板,划重点了啊】还在上学的学弟学妹,上课要专心,好好听,真的很有用)。

递归,尾递归,迭代。

1.递归与尾递归
然而JAVA并没有尾递归优化,懵逼0.0.。。。。
所以在JAVA 代码里面,尾递归?什么???不存在的。。。
还是讲一句,尾递归在别的语言里面可能是有用的,比如C,C++。【下面是谣言,我没验证过】写成尾递归形式,可以让编译器重复利用同一个栈帧,不仅不用释放上一个,连下一个新的都不用开,效率非常高。

2.递归与迭代
下面说迭代,先给个定义:
利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B。【就是一个重复结构】
如上面问题的解决办法,其实就是迭代。

印象中,总感觉递归和分治策略,动态规划有什么关系,本以为是替代,好好查了查资料,并不是。递归可是这些算法的实现,实际上一毛钱关系都没有。好了,关于递归的问题,这次就到这里了。要是哪里写的不对,还请各位指正,共同进步!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值