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

2023-10-29

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归查询与迭代查询实例说明 的相关文章

  • Java - 将无符号十六进制字符串解析为有符号长整型

    我有一堆十六进制字符串 其中之一是 d1bc4f7154ac9edb 这是 3333702275990511909 的十六进制值 如果执行 Long toHexString d1bc4f7154ac9edb 这与您得到的十六进制相同 现在
  • 从 Android 函数更新 Textview

    有人可以告诉我如何从函数更新 Android Textview 控件吗 我在互联网上进行了深入搜索 看到很多人都问同样的问题 我测试了线程但无法工作 有人有一个简单的工作示例吗 例如 调用一个函数 在循环中运行多次 并且该函数在 TextV
  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

    class 文件的常量池中有一个 NameAndType 结构 它用于动态绑定 该类可以 导出 的所有方法都被描述为 签名 返回类型 喜欢 getVector Ljava util Vector 当某些 jar 中方法的返回类型发生更改时
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • Java:一种将 Mime(内容)类型与 CommonsMultipartFile 中的文件扩展名相匹配的方法

    在我的公司 出于额外原因 我需要将 mime 类型与文件扩展名进行比较 我有一个CommonsMultipartFile 我正在尝试找出进行这种比较的最佳方法 我见过一个MimetypesFileTypeMap 但不确定这是否适用于此 我试
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 当我们使用赋值而不是比较时,如何评估 if/while 条件?

    我在学习 Java 的 OCA OCP 时发现了这个令人惊讶的事情 下面是第一段代码 其中 if 测试条件 部分 让我惊讶 public class BooleanIf public static void main String args
  • Spring 从 JBoss 上下文加载 PropertySourcesPlaceholderConfigurer

    我有一个使用 PropertySourcesPlaceholderConfigurer 的 spring 3 1 应用程序加载设置 我想管理测试和生产环境 只需从服务器上下文加载设置覆盖本地文件属性中指定的设置 下一个示例在 Tomcat
  • Google 表格使用 API 密钥而不是 client_secret.json

    In the QuickStart java示例Java 快速入门 https developers google com sheets api quickstart java他们使用OAuth client ID识别该应用程序 这会弹出一
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • 难以理解 通配符

    我有一个非常基本的问题 下面的代码无法编译 假设 Apple Extends Fruit List
  • Axis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败

    Axis2 有替代方案吗 或者让它工作的方式 例如不同的数据绑定 Retrieving document at Exception in thread main org apache axis2 wsdl codegen CodeGener
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • latex 参考文献没有显示_LaTeX 中的参考文献

    LaTeX 的对参考文献的处理实在是非常的方便 我用过几次 有些体会 写出来供大家 参考 当然 自己的功力还不够深 有些地方问题一解决就罢手了 没有细究 LaTeX 对参考文献的处理有这么一些优点 1 可以维护一个 bib 文件 在你的整个
  • 系统架构技能之设计模式-组合模式

    一 上篇回顾 我们上篇主要讲述了结构型模式中的外观模式 外观模式作为结构型模式中的一个简单又实用的模式 外观模式通过封装细节来提供大粒度的调用 直接的好处就是 封装细节 提供了应用写程序的可维护性和易用性 外观模式一般应用在系统架构的服务层
  • 【转】Vector与ArrayList区别

    the following is from http blessed24 javaeye com blog 751336 1 Vector ArrayList 1 Vector的方法都是同步的 Synchronized 是线程安全的 thr
  • 以太坊DAO之时间锁定Multisig

    Decentralized Autonomous Organization 简称DAO 以太坊中重要的概念 一般翻译为去中心化的自治组织 有时候 时间也可以用作一种很好的安全机制 以下代码基于DAO区块链大会 但有不同的变化 不是每个操作需
  • IdWorker---分布式ID工具类

    IdWorker 分布式ID工具类 import java lang management ManagementFactory import java net InetAddress import java net NetworkInter
  • ip地址的转换与递增

    void a void unsigned long addr inet addr 192 168 0 1 addr ntohl addr addr addr htonl addr char a 0x20 in addr in in S un
  • jenkins 发送邮件失败

    jenkins 配置发送邮件 发送测试邮件 邮件发送失败 Failed to send out e mail javax mail MessagingException Could not connect to SMTP host loca
  • C语言中的弱符号与强符号介绍

    弱符号 Weak symbol 是链接器 ld 在生成ELF Executable and Linkable Format 缩写为ELF 可执行和可链接格式 是一种用于可执行文件 目标文件 共享库和核心转储的标准文件格式 ELF文件有两种索
  • Git如何拉项目

    summary 放置 pub文件后 直接clone即可 Git设置SSH命令 ssh keygen t rsa C dong dong是用户名 passphrase是在私钥上又加了一层加码 一般直接回车不用设置 Git拉项目需要在项目服务器
  • JVM优化(OOM,内存溢出),查看线程快照,堆内存情况等问题

    1 堆大小 新生代 老年代 新生代 Young 与老年代 Old 的比例的值为 1 2 该值可以通过参数 XX NewRatio 来指定 2 Xmn参数总是应当小于 Xmx参数 否则就会触发OOM错误 3 jvm优化与查看gc回收情况 gc
  • WDK李宏毅学习笔记第二十周01_Deep Reinforcemen Learning

    Deep Reinforcemen Learning 文章目录 Deep Reinforcemen Learning 摘要 1 Reinforcemen Learning RL 是什么 1 1 RL的做法 1 1 1 Function wi
  • 6.4 PyTorch实现Skipgram模型

    欢迎订阅本专栏 PyTorch深度学习实践 订阅地址 https blog csdn net sinat 33761963 category 9720080 html 第二章 认识Tensor的类型 创建 存储 api等 打好Tensor的
  • [游戏更新]游戏更新框架的设计

    主要是通过文章来记录一下游戏更新流程的框架设计 资源打包 资源下载等 热更新的功能框架使用的是XLua 这里不做详细介绍 流程图 因为是海外游戏 考虑到GooglePlay对包体大小的限制 因此 会有一些资源做成压缩包 在特定时间进行下载
  • 学习grep(参数)选项

    grep一般格式为 grep 选项 基本正则表达式 文件 这里基本正则表达式可为字符串 1 1 双引号引用 在grep命令中输入字符串参数时 最好将其用双引号括起来 例如 m y s t r i n g 这样做有两个原因 一是以防被误解为s
  • 使用python时,ModuleNotFoundError: No module named ‘win32api‘处理方法

    方法一 亲测有效 直接 pip install pywin32 就行了 方法二 转载自https blog csdn net qq 41676500 article details 89282872 1 环境 win10 python3 7
  • Golang面试题(51-75)

    51 读写锁RWMutex的实现原理 概念 读写互斥锁是对Mutex的一个扩展 当一个Goroutine获得读锁后 其他Goroutine仍然可以获取读锁 当一个Goroutine获取写锁后 其他Goroutine不能获取读锁和写锁 使用场
  • Godot 4 源码分析 - 文件读入编码处理

    今天需要读入xml文件进行处理 结果读入一个带中文的文件时 出错了 当然程序还能运行 但编译器一直报错 而且XML解析也不正确 单步调试发现读入的内容出现乱码 具体逻辑 String FileAccess get as text bool
  • 剪贴板是计算机系统,剪贴板在哪里,手把手教你如何打开电脑剪贴板

    电脑上的剪切板对用户来说是非常重要工具 经常要用到它 复制或者移动的文件 都是先放在 剪贴板 里面 然后从这里面复制或者移动到指定的地方去 但是许多用户反映说不懂得 那么剪切板究竟该如何打开呢 下面 小编给大家讲解打开电脑剪贴板的技巧 作为
  • 软件项目的全生命周期

    就职于软件行业的人 无论是销售 售前 技术还是财务一定都会接触到关于项目运作相关的工作 不同职位的员工对于项目的关注点也大不相同 财务人员关注项目的收款节点 销售人员关注项目的商务关系及前期引导 实施人员关注项目的实施过程等等 这就造成各个
  • 递归查询与迭代查询实例说明

    转载请注明来源 作者 loongshawn http blog csdn net loongshawn article details 55261897 建议读者阅读原文 确保获得完整的信息 1 定义说明 熟悉几个概念 循环 loop 最基