递归查询与迭代查询实例说明

时间:2022-09-19 10:34:21

转载请注明来源-作者@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