温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java递归优化的方法是什么

发布时间:2021-12-30 09:42:32 来源:亿速云 阅读:480 作者:iii 栏目:大数据

这篇文章主要讲解了“Java递归优化的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java递归优化的方法是什么”吧!

   1.go to语法

    今天偶然看到ThreadPoolExecutor的addworker方法用到了go to,他到底是个优雅高级语法,还是个混淆语法。

public static void main(String[] args) {        for (int i = 0; i <2; i++) {            for (int j = 0; j < 5; j++) {                System.out.println(j);                if(j==3){                    break;                }            }        }        System.out.println("==================");        retry:        for (int i = 0; i <2; i++) {            for (int j = 0; j < 5; j++) {                System.out.println(j);                if(j==3){                    break retry;                }            }        }    }

普通的break跳出了当前for循环,但没有结束外层循环

retry 标识此处循环跳出,标识位在外层循环外面,跳出外循环。

   2.递归优化

递归算法空间复杂度:递归深度n*每次递归所要的辅助空间,如果每次递归所需要的辅助空间为常数,则递归空间复杂度o(n)。

    优化前

public Long filterOrg(Long orgId) {        CountVo vo= gMapper.queryOrId(orgId);        if(vo==null){            return orgId;        }else if(1==vo.getPid()){            return orgId;        }else{            return filterOrg(vo.getPid());        }

业务逻辑不考虑pid为null情况

  1. 参数传入之前写在lambada表达式中没有判空

  2. 这个if看着贼烦

  3. N级节点递归层次太深

优化

 public Long filterOrg(Long orgId) {        if (orgId == 1) return orgId;        Long serachId = orgId;        for (; ;) {             CountVo vo = this.queryOrgId(serachId);             if(vo==null||vo.getPid()==1)return orgId;            serachId=vo.getPid();        }    }

然后kk不知廉耻的写上了一段注释,深藏功与名

 /**     * 功能描述: 舍弃递归,复杂度降低,避免栈溢出     * @Param: [orgId]     * @Return: java.lang.Long     * @Author: kk     */

看着这个多层if就想起被千行foreach+if支配的恐惧,必须干掉他,写到这竟然笑出了声,可能这就是菜鸡成长的喜悦吧。

尾递归

函数调用自身,称为递归。如果尾调用自身,就称为尾递归。递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。这个优化厉害了

function factorial(n, total) {  if (n === 1) return total;  return factorial(n - 1, n * total);} factorial(5, 1) // 120

尾递归优化

function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {  if( n <= 1 ) {return ac2};   return Fibonacci2 (n - 1, ac2, ac1 + ac2);} Fibonacci2(100) // 573147844013817200000Fibonacci2(1000) // 7.0330367711422765e+208Fibonacci2(10000) // Infinityhttps://blog.csdn.net/qq_37818095/article/details/81944809

虽然这是js的

用队列优化递归

    public void getFile(File file){        if(file.isDirectory()){//如果是目录            File[] files = file.listFiles();            for(int i=0;i<files.length;i++)                getFile(files[i]);//递归        }        else if(file.isFile()){            //如果是文件,就输出。            System.out.println(file.getName());        }    }

使用队列优化。

//创建一个队列Queen<File> queue = new LinkedList<File>();queue.offer(file);while(!queue.isEmpty()){//如果队列不为空File file = queue.poll();if(file.isDirectory()){//从队列中获取一个FileFile[] files = file.listFiles();//是目录,将目录下所有文件遍历出来,存储到队列中for(int i =0;i<files.length;i++)queue.offer(files[i]);
    }else{//是文件,进行输出。System.out.println(file.getName());
    }

}

感谢各位的阅读,以上就是“Java递归优化的方法是什么”的内容了,经过本文的学习后,相信大家对Java递归优化的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI