一、递归
递归自己调用自己,调用过程是一个碗状结构。但是需要确保在碗底能得到基准情形(数据)。有点类似多线程中嵌入多线程在解决斐波那契时的sync。其本质特征是一个大问题可以分解成更小的问题,小问题解法和大问题一样。
每次调用函数都要有三个操作:调用前先保存寄存器,并在返回时恢复;复制实参;旧值不能释放,程序必须转向一个新位置执行。这种每次去代码区调用函数,然后栈区计算且不能释放,会带来大量计算,而且栈区比较小,不能嵌套太多层。内联函数不能递归,编译器会忽略甚至报错。
二、递归的非递归解法
(1)“尾递归”
从碗底开始,往上迭代。
(2)非递归
编译器无法自动优化一般的递归函数,不过通过模拟递归函数的过程,我们可以借助于栈将任何递归函数转换为迭代函数。直观点,递归的过程其实是编译器帮我们处理了压栈和出栈的操作,转换为迭代函数就需要手动地处理压栈和出栈。
下面我们以经典的快速排序为例子。
http://blog.jobbole.com/109124/