转载请注明来源-作者@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 2017
2017-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-1
2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - baseDate-Sat Feb 18 00:00:00 CST 2017
2017-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-1
2017-02-20-17-40 [scheduler-1] [com.loongshawn.method.pmc.AlarmTask] [INFO] - baseDate-Sun Feb 19 00:00:00 CST 2017
2017-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