大家好,又见面了,我是你们的朋友全栈君。今天我们来谈谈迭代和递归的区别。
从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。
首先,我们来看递归。递归是指重复调用函数自身实现循环。递归实际上不断地深层调用函数,直到函数有返回才会逐层的返回。递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域。因此,递归涉及到运行时的堆栈开销(参数必须压入堆栈保存,直到该层函数调用返回为止),所以有可能导致堆栈溢出的错误。但是递归编程所体现的思想正是人们追求简洁、将问题交给计算机,以及将大问题分解为相同小问题从而解决大问题的动机。例如:if else 调用自己,并在合适时机退出。
接下来,我们来看迭代。迭代是指利用变量的原值推出新值。迭代是函数内某段代码实现循环。迭代大部分时候需要人为的对问题进行剖析,分析问题的规律所在,将问题转变为一次次的迭代来逼近答案。迭代不像递归那样对堆栈有一定的要求,另外一旦问题剖析完毕,就可以很容易的通过循环加以实现。迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。例如:for,while循环。
最后,我们来看两者关系。所有的迭代可以转换为递归,但递归不一定可以转换成迭代。
总结如下:
1. 迭代是人,递归是神;
2. 递归是函数不断调用自身;
3. 迭代是通过循环逐步推进;
4. 迭代效率高,但不易理解;
5. 递归易理解,但可能导致堆栈溢出;
6. 所有的迭代都可以转换为递归,但并非所有递归都能转换为迭代;
7. 迭代和递归都是解决问题的方法,根据实际问题选择合适的方法。