递归查询与迭代查询实例说明
来源:互联网 发布:淘宝花呗在哪里开通 编辑:程序博客网 时间:2024/05/23 13:27
转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/55261897,建议读者阅读原文,确保获得完整的信息
1 定义说明
熟悉几个概念:
- 循环(loop) - 最基础的概念, 所有重复的行为
- 递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况
- (数学)迭代(iterate) - 在多次循环中逐步接近结果
- (编程)迭代(iterate) - 按顺序访问线性结构中的每一项
- 遍历(traversal) - 按规则访问非线性结构中的每一项
所谓 递归查询过程 就是 “查询的递交者” 更替, 而 迭代查询过程 则是 “查询的递交者”不变。
举个例子来说,你想知道某个一起上法律课的女孩的电话,并且你偷偷拍了她的照片,回到寝室告诉一个很仗义的哥们儿,这个哥们儿二话没说,拍着胸脯告诉你,甭急,我替你查(此处完成了一次递归查询,即,问询者的角色更替)。然后他拿着照片问了学院大四学长,学长告诉他,这姑娘是xx系的;然后这哥们儿马不停蹄又问了xx系的办公室主任助理同学,助理同学说是xx系yy班的,然后很仗义的哥们儿去xx系yy班的班长那里取到了该女孩儿电话。(此处完成若干次迭代查询,即,问询者角色不变,但反复更替问询对象)最后,他把号码交到了你手里。完成整个查询过程。
2 举例说明
2.1 递归查询
提供一个plusWorkingDay函数,获取当前时间第n个工作日的日期(过滤掉周六、周日),此函数实现过程中通过自身调用完成计算,具体方法如下:
// 获取加n工作日 public static Date plusWorkingDay(Date baseDate, int day){ Date temp = null; Date date; int weekendCount = 0; logger.info("baseDate-" + baseDate); for (int i=1;i<=day;i++){ temp = plusOrMinusDate(baseDate, i); String week = dateToWeek(temp); logger.info(i + "-" + week); if (week.equals("星期六") || week.equals("星期日")){ weekendCount++; } } logger.info("weekendCount-" + weekendCount); if (weekendCount > 0){ date = plusWorkingDay(temp,weekendCount); } else { date = temp; } return date; }
计算2月13日起第5个工作日的日期为2月20日,经历了2递归查询,计算日志如下:
2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - baseDate-Mon Feb 13 00:00:00 CST 20172017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - 1-星期二2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - 2-星期三2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - 3-星期四2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - 4-星期五2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - 5-星期六2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - weekendCount-12017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - baseDate-Sat Feb 18 00:00:00 CST 20172017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - 1-星期日2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - weekendCount-12017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - baseDate-Sun Feb 19 00:00:00 CST 20172017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - 1-星期一2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - weekendCount-0
2.2 迭代查询
举一个例子讲解迭代查询,在DNS域名解析过程中,若本地hosts和DNS缓存中都不存在一个域名的对应关系,则会去远程不同节点的DNS服务器检索,直到查到该域名匹配的IP。
每次迭代都会更接近结果,它是一个收敛的过程,这与普通的循环是有区别的。
3 两者间区别
递归查询过程中查询的主体发生了交换,而迭代查询过程中主体保持不变。至于两种查询哪种效率高,还得依据实际工程来取舍,本文不作深入讨论。
4 参考
[1] https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/03.1.md
- 递归查询与迭代查询实例说明
- 递归查询与迭代查询实例说明
- DNS 迭代查询与递归查询
- DNS递归查询与迭代查询
- DNS的递归查询与迭代查询
- DNS迭代查询,递归查询
- dns迭代查询和递归查询
- DNS递归与迭代查询次数计算
- DNS递归查询和迭代查询的区别
- DNS递归查询和迭代查询的区别
- DNS递归查询和迭代查询的区别
- 递归查询和迭代查询的区别
- oracle递归查询实例
- 递归和迭代区别(以前查询资料整理)
- ibatis 迭代查询
- ibatis 迭代查询
- oracle 迭代查询
- Oracle 迭代查询
- 集电极开路输出、开漏输出、推挽输出
- 润乾报表split和list函数对数组分类显示
- MyBatis批量插入主键回写
- C++事件的建立和使用SetEvent,ResetEvent
- Blog开篇
- 递归查询与迭代查询实例说明
- 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL
- Android sensor架构(二)SystemSensorManager以及JNI、sensorService(and5.1)
- js 获取元素所有兄弟节点的实现方法
- 类似淘宝头条的view滚动第二种实现方式
- C语言struct和typedef struct的区别
- java 蓝桥杯 Sine之舞
- android中WebView附件问题解决
- mysql insert 相关的锁函数lock_rec_insert_check_and_lock 源码