循环(loop)
指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
迭代(iterate)
指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
本质:利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
循环与迭代的异同
循环和迭代的共同点在于,它们都是在描述一个多次操作。
不同点在于,循环侧重于描述每次操作和上一次操作【相同之处】,而迭代侧重于描述每次操作和上一次操作的【不同之处】。
递归(recursion)
指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。
递归与迭代的异同
递归的过程中, 问题的规模在缩小,这样最终得到问题的解;而迭代是一种由远变近的逼近,问题的规模不见得缩小了,但是慢慢在调整接近答案。
递归求解n的阶乘过程,非常符合这个描述;而数值分析课程里的许多方法,比如牛顿迭代法,也是符合这个描述的。
三者的优缺点
循环的缺点就是不容易理解,编写复杂问题时困难。优点是效率高,运行时间只因循环次数增加而增加,没什么额外开销。空间上没有什么增加。
迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。
递归其实是方便了程序员难为了机器。它只要得到数学公式就能很方便的写出程序。优点就是易理解,容易编程。但递归是用栈机制实现的,将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。每次函数调用都要压栈,那么空间复杂度是O(n),和递归次数呈线性关系。
遍历
遍历:依次对集合中的每个元素做且仅做一次访问。依次,代表具有某种顺序。比如二叉树有三种前序、中序、后序遍历。数组有顺序、逆序遍历等等。
有趣的比拟
迭代——《明日边缘》
递归——《盗梦空间》
买玩具
【循环】
你去小卖铺买了一个玩具,拿回家后孩子不喜欢,你也没问他为什么不喜欢。然后你又去同一个小卖铺买了一个玩具,拿回家后孩子又不喜欢。。。如此往复 10 次,孩子才满意。
每次去买玩具的目标、行为都一样,这叫循环。
【迭代】
你去小卖铺买了个一个玩具,拿回家后孩子不喜欢。你耐心的询问后得知他喜欢乐高的玩具,于是你就去大超市给他买了乐高,回家后孩子还是不喜欢,耐心询问后得知他喜欢乐高玩具中最贵的那个玩具,于是你就去奢侈品商店给他买了乐高限量版玩具,拿回家后孩子很满意。
每次去买玩具都跟上一次不一样,或是有了新的目标,或是缩小了搜寻范围,这叫迭代。
【递归】
你自己不太了解小孩子的需求,为了缩小范围,让你的儿子去给孙子挑选。儿子比你强点有限,但依然不太了解小孩子的需求。为了缩小范围,你又让你孙子去挑选。如此这般,直到找到合适的玩具。
【遍历】
参考资料:
https://blog.csdn.net/u014775977/article/details/53930052
https://www.zhihu.com/question/20278387