递归改成循环_递归比循环效率高吗

递归改成循环_递归比循环效率高吗Java递归,递归改循环为什么大家都说不建议用递归?递归容易造成栈溢出,在jdk1.5前虚拟机给每个栈桢的运行空间128kb,在1.5以后为1m的运行空间.递归是指先进后出,也就是说第一进栈的对象会最后一个出站,然后栈桢的空间只有1m,生产环境的数据需要递归的深度,一般情况下我们无法通过测试来进行模拟。所以对于递归的深度不可把控的情况下,是有栈溢出的风险。一个简单的例子测试递归的深度递…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Java递归,递归改循环

为什么大家都说不建议用递归?

递归容易造成栈溢出,在jdk1.5前虚拟机给每个栈桢的运行空间128kb,在1.5以后为1m的运行空间.递归是指先进后出,也就是说第一进栈的对象会最后一个出站,然后栈桢的空间只有1m,生产环境的数据需要递归的深度,一般情况下我们无法通过测试来进行模拟。所以对于递归的深度不可把控的情况下,是有栈溢出的风险。

一个简单的例子测试递归的深度

在这里插入图片描述
在这里插入图片描述

递归的使用注意点

1.注意递归的结束条件

递归的优势

代码简单清晰,一看就懂,如果在不会照成栈溢出还是建议使用递归的。

所有的递归都可以改循环吗?理论上是可以的。以下一个嵌套递归,改循环的例子

嵌套递归:工作要求需要将一个集合中有subList的对象的code记录一下,无subList对象的code记录在一起

  //递归查到所有的drugtypes
  //嵌套递归,将drugTypes中有子集的code放在一个list中,没有子集的code放在一个list中。
  private void setHasChild( List<BaseDrugType> drugTypes,List<String> hasChildCodeList ,List<String> hasNotChildCodeList){ 
   

    for (BaseDrugType drugType:drugTypes){ 
   
      if (drugType == null){ 
   
        continue;
      }
      //递归查询
      if (CollectionUtils.isNotEmpty(drugType.getSubTypes())){ 
   
        hasChildCodeList.add(drugType.getCode());
        setHasChild(drugType.getSubTypes(),hasChildCodeList,hasNotChildCodeList);
      }else { 
   
        hasNotChildCodeList.add(drugType.getCode());
      }
    }
  }

嵌套递归改循环

  private void setHasChild2( List<BaseDrugType> drugTypes,List<String> hasChildCodeList ,List<String> hasNotChildCodeList){ 
   

    Stack<BaseDrugType> stack = new Stack<BaseDrugType>();

    for (BaseDrugType drugType:drugTypes){ 
   
      if (drugType == null){ 
   
        continue;
      }
      stack.push(drugType);
    }

    while (!stack.isEmpty()){ 
   
      BaseDrugType popType = stack.pop();
      if (CollectionUtils.isNotEmpty(popType.getSubTypes())){ 
   
        hasChildCodeList.add(popType.getCode());
        for (BaseDrugType b:popType.getSubTypes()){ 
   
          if (b == null){ 
   
            continue;
          }
          stack.push(b);
        }
      }else { 
   
        hasNotChildCodeList.add(popType.getCode());
      }
    }
  }

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
在这里插入图片描述

Stack对象是堆中维护一个堆栈对象。而递归是在栈中维护堆栈对象。一个空间大一个空间小,而堆的空间很大,正常运用不可能造成堆溢出。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192384.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux删除文件命令「建议收藏」

    Linux删除文件命令「建议收藏」删除文件(即这个文件被删除) 单个删除:rm-f+文件名 eg:rm-f2018_12_26.stderrout.log.060121612–执行完成即将这个文件删除 批量删除:rm-f+*文件关键字* eg:rm-frm*stderrout.log*–执行完成后即将所有的名称包括stderrout.log的文件都删除(前面后面的*按照实际…

    2022年6月18日
  • 安装SPSS22_SPSS 24安装教程

    安装SPSS22_SPSS 24安装教程学习统计学必不可少的一个软件就是SPSS,这个软件非常的重要,但是随着时代的发展貌似又开始逐渐变得有点鸡肋,然而,我们还是要学,没辙,哈哈哈哈~接下来就跟着我一起安装一个SPSS22吧!首先你需要一个Windows电脑(Mac再说,风紧扯呼),最好是win10,然后在百度云下载必要的程序与秘钥百度云提取码:kp68里面包括exeandtxt下载下来后打开文件夹进入SPSS文件夹右击此文件,选择“以管理员权限运行”点击“下一步”选择“的那个用户许可证”,点击“下一步”选择“我接受许

    2022年10月23日
  • XQuartz_squawking

    XQuartz_squawkingXQuartzの简单使用

    2022年10月22日
  • C++中this指针的作用以及用法详解

    C++中this指针的作用以及用法详解为什么引用this指针?当我们在类中定义了一个变量,同时又在类成员函数中定义了同一个变量时,也就是变量名重复时,但是我们要想使用类中的定义的变量,此时就需要this指针了。1.this指针的作用指针存在于类的成员函数中,指向被调用函数类实例的地址。 一个对象的this指针并不是对象本身的一部分,不会影响sizeof()的结果。this指针的作用域是在类内部,当在类的非静态成员函

    2022年5月13日
  • EXCEL解密打开密码

    EXCEL解密打开密码excel文件设置了打开密码,但是设置的密码忘记了,导致现在没有办法打开文件了,这种情况需要解密excel文件。解密的方法就是找回密码,而且MSOfficeExcel文件中没有提供找回密码功能,所以我们需要自己找回密码,可以用奥凯丰EXCEL解密大师。【EXCEL解密大师】快速找回密码_轻松移除使用限制-奥凯丰okfone…

    2022年6月28日
  • 利用PowerShell复制SQLServer账户的所有权限

    利用PowerShell复制SQLServer账户的所有权限

    2021年11月28日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号