数据结构与算法分析(一)---对递归的思考

一、递归

      递归自己调用自己,调用过程是一个碗状结构。但是需要确保在碗底能得到基准情形(数据)。有点类似多线程中嵌入多线程在解决斐波那契时的sync。其本质特征是一个大问题可以分解成更小的问题,小问题解法和大问题一样。

      每次调用函数都要有三个操作前先保存寄存器,并在返回时恢复;复制实参;旧值不能释放,程序必须转向一个新位置执行。这种每次去代码区调用函数,然后栈区计算且不能释放,会带来大量计算,而且栈区比较小,不能嵌套太多层。内联函数不能递归,编译器会忽略甚至报错。

二、递归的非递归解法

  (1)“尾递归” 

    从碗底开始,往上迭代。

   (2)非递归

    编译器无法自动优化一般的递归函数,不过通过模拟递归函数的过程,我们可以借助于栈将任何递归函数转换为迭代函数。直观点,递归的过程其实是编译器帮我们处理了压栈和出栈的操作,转换为迭代函数就需要手动地处理压栈和出栈。

   下面我们以经典的快速排序为例子。 

   http://blog.jobbole.com/109124/ 

猜你喜欢

转载自www.cnblogs.com/huangfuyuan/p/9124651.html
今日推荐