「循环」「遍历」「迭代」「递归」

前言

 

  在计算机技术书本中,表示「重复」的词汇有不少,其中loop、traversal、iterate和recursion是相对于其他词汇出现的比较多的四个词,他们各自的中文翻译是——「循环」「遍历」「迭代」和「递归」。尽管大致意义上,这四个词的意思都是「重复」,但细究的话,四个词之间似乎又有一些无法忽视的区别,那么这几个词的具体含义是什么呢?它们之间的区别和联系又是什么呢?

  注:本文中对「循环」「遍历」「迭代」「递归」这四个词汇,均以计算机编程作为讨论前提。

循环

  循环是程序设计语言中反复执行某些代码的一种计算机处理过程,常见的有按照次数循环和按照条件循环。  

 ——百度百科

  循环是一个大概念,指所有「重复」的行为。可以说,凡是被重复执行的代码,均是循环。大部分的「遍历」「迭代」「递归」,都是循环。

  在编程过程中,有不少功能的实现都具有规律性的重复操作,因此在程序中就需要重复执行部份语句,而这些被重复执行的代码,则被称作「循环体」,而决定「循环体」何时终止的条件,称为「终止条件」,「循环体」和「终止条件」组合起来,便成了「循环语句」。

遍历

  以集合数据为对象,按照一定的规则,逐个访问其中的所有数据节点且不重复既是遍历。该集合数据大多数为非线性结构。

——Sinot

  这是我通过自己的经验和理解,以及对百度百科的参考作出的定义。为什么该定义最后加了一句“该集合数据大多数为非线性结构”呢?因为对于线性结构(数组、链表等)的数据而言,逐个访问其中的每一项我们一般称为「迭代」。

  遍历算法一直都是计算机领域的一个重要研究方向,对一个问题的求解,本质上可以理解为对一事物的初始状态,通过已知的条件或规则进行修改,最终达到我们想要达成的目标状态。而将该事物的所有元素连接起来可以大大调高我们进行修改的效率,连接的这一过程便是「遍历」。

  在编程过程中,实现「深度优先遍历」或「广度优先遍历」,我们通常采用「递归」的方式。且对于「广度优先遍历」,我们通常家加上对应的标记数组进行辅助,避免出现重复访问的现象。针对「树」这一数据结构的「层次遍历」则通常需要在「递归」的基础上加上「栈」的数据结构辅助,用于判断当前遍历到那一层,并且将遍历的结果储存在链表中。

迭代

  迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

——百度百科

  对计算机特定程序中需要反复执行的子程序,进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。

——百度百科

  迭代,要细究的话需要分为数学方面和编程方面,我们主要讨论编程方面的「迭代」。数学方面的「迭代」我兴许以后会在算法方面的文章展开来讲。

  「迭代」是用计算机解决问题的一种基本常用的方法,很好的利用了计算机计算速度快,适合做重复做操作的特点。按照某种顺序逐个访问线性结构的数据集便是一种常用的「迭代」。对于「循环」,「循环体」可分为「固定循环体」和「动态循环体」,而「迭代」在算法方面更加趋向于「动态循环体」,因此「迭代」也常用于动态规划等算法实现当中。个人观点是,「迭代」属于「循环」的一种,并且偏向于拥有「动态循环体」。

递归

  程序调用自身的编程技巧称为递归。

——百度百科

  「递归」指的是一个函数或方法不断调用自己的行为。常见的递归有图和树的遍历,或是经典的1加到100等……

  因为「递归」是「循环」的一种,而「循环」大多数情况下都可以通过「迭代」实现,所以理论上,所有递归函数都可以转换为迭代函数,反之亦然,但是其代价通常是比较高的。因为「递归」通常有「回溯」的性质,因此将「递归」转换为「迭代」的时候,通常需要「栈」来加以辅助。若一个递归函数改用迭代时根本不需要「栈」,那么这个函数用递归实现大多数是为了提高可读性,让意义明显一些,或是程序员偷懒想要少写代码。

  当你想要通过递归来解决某一问题时,不妨通过以下5步进行思考。

    1. 创造一些简单的示例,并将其具象化。
    2. 找到这个问题最简单的情况。
    3. 创造一些稍复杂的示例,将它们与简单实例关联,找出其泛化规律。
    4. 概括他们的模式,尽可能写出数学公式。
    5. 最后,通过概括出来的数学公式编写代码。

小结

  循环(Loop):所有重复的行为皆是循环。

  迭代(Traversal):按照某种顺序逐个访问列表中的每一项。

  遍历(Iterate):按照一定规则访问非线性结构数据的所有元素。

  递归(Recursion):函数不断调用自身,一定有终止条件。

  如此一来,几个概念之间的区别其实就比较清楚了。至于它们之间的联系,严格来讲,它们似乎都属于算法的范畴。或者说它们只不过是解决问题的不同手段和方式,而本质上则都是计算机编程中达成特定目标的途径。

guest
0 评论
内联反馈
查看所有评论