递归优化

那篇并编程艺术3写完了,但下午发现了原创度更高的个人真实案例分析,反正已经写完了,随时可以发,个人问题的优化记忆才更深。

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) // 573147844013817200000
Fibonacci2(1000) // 7.0330367711422765e+208
Fibonacci2(10000) // Infinity
https://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()){
        //从队列中获取一个File
        File[] files = file.listFiles();
        //是目录,将目录下所有文件遍历出来,存储到队列中
        for(int i =0;i<files.length;i++)
            queue.offer(files[i]);
    }else{
        //是文件,进行输出。
        System.out.println(file.getName());
    }
}版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/pseudonym_/article/details/71600084

本文分享自微信公众号 - 赵KK日常技术记录(gh_cc4c9f1a9521),作者:赵kk

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jmeter系统入门教程(安装、组件使用、Demo展示、连接数据库、压测报告)

    压测工具实际项目中接触过ab,ab算一个常用而又直接的工具,jmeter以前自己测试过,但如此系统,细致的测试还是第一次,这个博主很多文章都很细致,问题解答及时

    疯狂的KK
  • 用户登录-访问权限+登录验证+xss过滤

    在系统登录时,除了正常的用户名密码验证之外,需要做登录后的访问权限,登录验证,以及输入字符验证,有些非权限页面可以无权限访问,比如帮助页面,版本...

    疯狂的KK
  • JAVA 并发真讨厌

    互联网行业随着商业化,信息化,快速发展至今,借助人口大国和时代催生,早已到了秀才不出门便知天下事的年代,80后吃饭就着菜,90后吃饭就着肉,00...

    疯狂的KK
  • Android状态栏与页面顶部内容重合解决方案

    在项目的开发过程中 , 发现创建activity界面后 , 界面顶部的返回按钮被状态栏遮挡住一部分 , 在点击返回的时候,很难触发点击事件,页面也不太美观,话不...

    SoullessCoder
  • 超好用的地图可视化神器

    kepler.gl作为开源地理空间数据可视化神器,也一直处于活跃的迭代开发状态下。而在前不久,kepler.gl正式发布了其2.4.0版本,下面我们就来对其重要...

    bugsuse
  • GEPIA:TCGA和GTEx表达谱数据分析平台

    GEPIA整合了来自TCGA和GTEx项目中的基因表达谱数据,提供了多种数据分析和可视化功能,操作简单,方便广大科研人员对肿瘤的表达谱数据进行挖掘,对应的文章发...

    生信修炼手册
  • 使用Pandas读取大型Excel文件

    from: cnblogs.com/everfight/p/pandas_read_large_number.html

    hankleo
  • aixcoder智能编程助手开发插件推荐

    总之是个让你更快开发的工具,支持java,python,对 SpringBoot,TensorFlow,JFinal, Android 等编程场景进行了特殊适配...

    老梁
  • Teamcenter RAC 查找数据集并获取数据集中文件

    路过君
  • 地图可视化神器kepler.gl近期重要更新

    kepler.gl作为开源地理空间数据可视化神器,也一直处于活跃的迭代开发状态下。而在前不久,kepler.gl正式发布了其2.4.0版本,下面我们就来对其重...

    Feffery

扫码关注云+社区

领取腾讯云代金券