循环,迭代和递归

循环(loop)

指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。

迭代(iterate)

指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。

本质:利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值

循环与迭代的异同

循环和迭代的共同点在于,它们都是在描述一个多次操作。

不同点在于,循环侧重于描述每次操作和上一次操作【相同之处】,而迭代侧重于描述每次操作和上一次操作的【不同之处】。

递归(recursion)

指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列

递归与迭代的异同

递归的过程中, 问题的规模在缩小,这样最终得到问题的解;而迭代是一种由远变近的逼近,问题的规模不见得缩小了,但是慢慢在调整接近答案

递归求解n的阶乘过程,非常符合这个描述;而数值分析课程里的许多方法,比如牛顿迭代法,也是符合这个描述的。

三者的优缺点

循环的缺点就是不容易理解,编写复杂问题时困难。优点是效率高,运行时间只因循环次数增加而增加,没什么额外开销。空间上没有什么增加。

迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。

递归其实是方便了程序员难为了机器。它只要得到数学公式就能很方便的写出程序。优点就是易理解,容易编程。但递归是用栈机制实现的,将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。每次函数调用都要压栈,那么空间复杂度是O(n),和递归次数呈线性关系。

遍历

遍历:依次对集合中的每个元素做且仅做一次访问。依次,代表具有某种顺序。比如二叉树有三种前序、中序、后序遍历。数组有顺序、逆序遍历等等。

有趣的比拟

迭代——《明日边缘》
递归——《盗梦空间》

买玩具

【循环】

你去小卖铺买了一个玩具,拿回家后孩子不喜欢,你也没问他为什么不喜欢。然后你又去同一个小卖铺买了一个玩具,拿回家后孩子又不喜欢。。。如此往复 10 次,孩子才满意。

每次去买玩具的目标、行为都一样,这叫循环。

【迭代】

你去小卖铺买了个一个玩具,拿回家后孩子不喜欢。你耐心的询问后得知他喜欢乐高的玩具,于是你就去大超市给他买了乐高,回家后孩子还是不喜欢,耐心询问后得知他喜欢乐高玩具中最贵的那个玩具,于是你就去奢侈品商店给他买了乐高限量版玩具,拿回家后孩子很满意。

每次去买玩具都跟上一次不一样,或是有了新的目标,或是缩小了搜寻范围,这叫迭代。

【递归】

你自己不太了解小孩子的需求,为了缩小范围,让你的儿子去给孙子挑选。儿子比你强点有限,但依然不太了解小孩子的需求。为了缩小范围,你又让你孙子去挑选。如此这般,直到找到合适的玩具。

【遍历】

爷爷去玩具大厦给孙子挑选玩具 。玩具大厦共4层,分布着若干玩具店铺。爷爷必须把所有玩具店都逛一遍,才能挑选出最好的玩具。爷爷可以先从4楼开始往下逛,也可以从1楼往上逛,还可以按照3楼、1楼、4楼、2楼的顺序(爷爷有他自己的想法……)。不管怎么逛,只要保证 每家店都去过一次、不重复去,那么就可以说是遍历了玩具店集合。
(整理自网络)

参考资料:

https://blog.csdn.net/u014775977/article/details/53930052

https://www.zhihu.com/question/20278387

Min是清明的茗
原文地址:https://www.cnblogs.com/MinPage/p/13992040.html