递归优化
时间:2022-07-22
本文章向大家介绍递归优化,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
那篇并编程艺术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情况
- 参数传入之前写在lambada表达式中没有判空
- 这个if看着贼烦
- 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
- 两部委印发车联网产业标准体系建设指南 提到了自动驾驶
- 状态开关按钮ToggleButton
- 微软开放 .NET 框架源代码
- Angularjs基础(十二)
- 妙趣横生的HTML5 Page Visibility API
- 禁止/移除 WordPress 4.2 中前台自动加载的 emjo 脚本
- 项目管理方面的几个.NET开源项目
- 如何向十岁以下的朋友解释编程?这个说法碉堡了!
- 快速比较和合并文件
- 前端页面中 iOS 版微信长按识别二维码的bug 与解决方案
- .NET Mass Downloader -整体下载.NET源码
- Android中Button
- Pycharm中一些不为人知的技巧
- Silverlight 2.0 beta1 堆栈
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Array - 220. Contains Duplicate III
- Array - 219. Contains Duplicate II
- Array - 217. Contains Duplicate
- Array - 299. Bulls and Cows
- Array - 189. Rotate Array
- Array - 277 Find the Celebrity
- Array - 80. Remove Duplicates from Sorted Array II
- Array - 508. Wiggle Sort
- Array - 376. Wiggle Subsequence
- Array - 283. Move Zeroes
- Array - 88. Merge Sorted Array
- Array - 228. Summary Ranges
- Array - 152. Maximum Product Subarray
- Focal Loss和它背后的男人RetinaNet
- Array - 53. Maximum Subarray