递去了怎么还归来了呢
递去是什么意思?递去其实就是发现了问题规模还可以再缩小,以相同的解决思路去求出最小的解。递去就是调用递归方法,程序没有直接往下执行,而是先走递归方法。但是没有走的剩下程序它还是会走的,一般除非程序走到了尽头结束了或者抛异常了才不会再执行。
归来是什么意思?归来就是调用递归方法求到解了,递归无法再进行下去了,程序就会回到调用递归方法处,继续走下面的语句,直到走完整个程序。
Controller
@GetMappingpublic TagTree list() {TagTree root = new TagTree();root.setTagId(0L);root.setTagName("ceam");List<SystemTagDef> list = this.tagDefJpa.findAll();this.child(root, list);return root;}
child(TagTree root, List<SystemTagDef> allTags)
private void child(TagTree root, List<SystemTagDef> allTags) {// 从allTags中取出对应子标签List<SystemTagDef> childs = allTags.stream().filter(item ->root.getTagId().equals(item.getParentId())).collect(Collectors.toList());allTags.removeAll(childs);// 注意forEach本身就是有终止条件的,即遍历到最后一个元素childs.forEach(item -> {TagTree tag = new TagTree();tag.setTagId(item.getTagId());tag.setTagName(item.getTagName());tag.setParentId(item.getParentId());// 递归调用this.child(tag , allTags);root.appendChildren(tag);});}
表数据(共7条)
我们重点看看child方法数据变化
1、
root | allTags | remove后的allTags | childs | 第二个item | tag |
ceam | 7条数据 | 5条数据(可可、丫丫、柚柚、微微、贝贝) | 2条数据(一级标签、CeaM) | 一级标签 | 一级标签 |
2、调用this.child(tag , allTags);传入参数值为"一级标签对象",(可可、丫丫、柚柚、微微、贝贝)
root | allTags | remove后的allTags | childs | 第二个item | tag |
一级标签 | 5条数据(可可、丫丫、柚柚、微微、贝贝) | 柚柚、微微、贝贝 | 可可、丫丫 | 可可 | 可可 |
3、调用this.child(tag , allTags);传入参数值为"可可对象",(柚柚、微微、贝贝)
root | allTags | remove后的allTags | childs | 第二个item | tag |
可可 | 柚柚、微微、贝贝 | 柚柚、微微、贝贝 | 1 | 贝贝 | 贝贝 |
4、调用this.child(tag , allTags);传入参数值为"贝贝对象",(柚柚、微微)
root | allTags | remove后的allTags | childs | 第二个item | tag |
贝贝 | 2条数据(柚柚、微微) | 柚柚、微微 | 0 | 0 | 0 |
由于childs为0,即无子项item再不会递归调用,于是回到执行this.child(tag , allTags);下面语句
root.appendChildren(tag);
再执行步骤4前数据场景是3,即root为"可可对象",tag为贝贝。于是将贝贝添加到一级标签
5、 添加贝贝后回到3继续走foreach发现没有item,于是回到2处走下面语句,将可可添加到一级
root.appendChildren(tag);
root | allTags | remove后的allTags | childs | 第二个item | tag |
一级标签 | 2条(柚柚、微微) | 可可 | 可可 |
6、添加可可后继续走foreach,item为丫丫
root | allTags | remove后的allTags | childs | 第二个item | tag |
一级标签 | (柚柚、微微) | 丫丫 | 丫丫 |
7、调用this.child(tag , allTags);传入参数值为"丫丫对象",(柚柚、微微)
root | allTags | remove后的allTags | childs | 第二个item | tag |
丫丫 | (柚柚、微微) | (柚柚、微微) | 0 | 0 | 0 |
由于childs为0,即无子项item再不会递归调用,于是回到执行this.child(tag , allTags);下面语句
root.appendChildren(tag);
再执行步骤7前数据场景是6,即root为"一级标签对象",tag为丫丫。于是将丫丫添加到一级标签
8、添加丫丫后发现一级标签没有item于是结束一级标签遍历回到1执行未走的程序
root.appendChildren(tag);
root | allTags | remove后的allTags | childs | 第二个item | tag |
ceam | (柚柚、微微) | 一级标签 | 一级标签 |
9、将一级标签添加到跟ceam继续forEach遍历item为CeaM
root | allTags | remove后的allTags | childs | 第二个item | tag |
ceam | (柚柚、微微) | CeaM | CeaM |
10、调用this.child(tag , allTags);传入参数值为"CeaM对象",(柚柚、微微)
root | allTags | remove后的allTags | childs | 第二个item | tag |
CeaM | (柚柚、微微) | 0 | (柚柚、微微) | 柚柚 | 柚柚 |
11、走forEach,调用this.child(tag , allTags);传入参数值为"柚柚对象"
root | allTags | remove后的allTags | childs | 第二个item | tag |
柚柚 | 0 | 0 | 0 |
12、发现"柚柚对象"无法走forEach,于是回到10走未走完的程序
root | allTags | remove后的allTags | childs | 第二个item | tag |
CeaM | 0 | 柚柚 | 柚柚 |
root.appendChildren(tag);
13、将柚柚添加到CeaM,继续走forEach
root | allTags | remove后的allTags | childs | 第二个item | tag |
CeaM | 0 | 微微 | 微微 |
14、调用this.child(tag , allTags);传入参数值为"微微对象"
root | allTags | remove后的allTags | childs | 第二个item | tag |
微微 | 0 | 0 | 0 | 0 | 0 |
15、发现"柚柚对象"无法走forEach,于是回到14走未走完的程序
root | allTags | remove后的allTags | childs | 第二个item | tag |
CeaM | 0 | 微微 | 微微 |
root.appendChildren(tag);
16、将微微添加到CeaM后,发现CeaM没有item于是结束CeaM遍历回到9执行未走的程序
root | allTags | remove后的allTags | childs | 第二个item | tag |
ceam | 0 | CeaM | CeaM |
root.appendChildren(tag);
将CeaM添加到ceam后forEach遍历结束,整个程序走完。
递去了怎么还归来了呢相关推荐
- 19岁少年震惊科技界,被NASA邀去工作,还见奥巴马!
19岁少年震惊科技界,被NASA邀去工作,还见奥巴马! 他为7岁小女孩, 装上了隐形的翅膀. ··· 科技鬼才 Technical Genius 他才19岁, 便用一项发明震惊科技界. Easton ...
- 居家办公竟比去公司上班还累?
hello,大家好,我是张张,「架构精进之路」公号作者. 随着疫情管控的逐步升级,今年上半年相信大部分同学都经历了居家办公的情况,就我自己而言,就有将近2个月的时间是采取的居家办公模式的. 一提到居家 ...
- 现在想读博以后去高校,还值得吗?
每天给你送来NLP技术干货! 本文来源:学术志(ID:xueshuzhi001)综合整理自知乎.小红书等 在2022年学位与研究生教育发表的论文<我国博士毕业生去向及就业特征分析--基于2015 ...
- html超链接去虾线,还在用牙签、剪刀去虾线?教大家一招,一秒一个!
虾,是大自然馈赠的至鲜滋味. 国人酷爱吃虾,也善于烹虾. 清蒸.白灼.蒜蓉.红烧. 油焖.炸-- 随你喜欢怎么吃就怎么吃!!! 此外,虾种类繁多, 还能带来不同的味觉体验. 江虾鲜美.河虾嫩滑.湖虾鲜 ...
- 我进不去大厂,还不是因为没搞懂它!
我出去面试开场白过后,面试官经常问我一个看似简单的问题:浏览器打开一个网站,都经历了什么?后面基本都是围绕这个问题聊 HTTP 协议,我总是答不出一个满分的答案.直到我遇到了 Nginx/OpenRe ...
- 如何去找一些还没有完全上市的 在私募投资的公司 D轮左右 财经媒体
- 十一黄金周出游,去哪里人少还便宜?
单位 :)
- syntax error near unexpected token 脚本报错误解决【转】
第一种方法失败了,win的文本自带^M的确是问题 原创 syntax error near unexpected token 脚本报错误解决 2018-03-14 21:25:53 會飛的土豆 阅读数 ...
- 一个生物专业学生的内心独白:我为什么能去互联网大厂?能解剖兔子,手焊PCB,调试FPGA,还能手撕LRU!
这回,考虑到近期关注了许多新朋友,并且大多都是学生党,可能对我还不是特别熟悉.因此我决定重新把我从非科班如何通过自学(狗屎运)进入大厂的经历分享出来,希望能够给予一些将要面临秋招,或者将要准备进入互联 ...
最新文章
- 网页鼠标滚动实现图片缩放
- 如何快速阅读一篇英文文献
- 减小Delphi的Exe文件大小
- Linux的apache的allowoverwrite参数的解释
- linux指令快速复制粘贴[龟速更新中]
- linux iopen i2c dev,i2c-dev - Linux驱动子系统之I2C_Linux编程_Linux公社-Linux系统门户网站...
- linux学习第九天 (Linux就该这么学)
- 迷你星域冒险服务器维护中,迷你世界星域冒险
- Bootstrap学习(一)
- [Windows] 集福宝- 支付宝 集福神器 2019
- 卫星地图上,深圳梧桐山这一条白线是什么
- 交换机配置snmp及查看snmp配置信息
- HR常用的人力资源系统软件有哪些?
- win7系统音响没有声音的解决设置方法
- Android:通过systrace进行性能分析及使用-详细
- 电子科技大学计算机科学与技术考研复试,电子科技大学计算机科学与工程学院2021考研招生复试工作安排...
- 安装 Mongrel
- 协众信息技术平面设计的8种类型
- 粒子动画,做礼物,雪花等特效
- 王者的世界:全球十大对冲基金公司传奇