递归是指函数/过程/子程序在运行过程中直接或间接的调用自身而产生的重入现象。
在定义一个过程或函数时出现调用本过程或本函数的成分,称为递归。若调用自身,称为直接递归。若过程
或函数p调用过程或函数q,而q又调用p,称为间接递归。
在以下三种情况下,需要用到递归的方法。
1. 定义是递归的
有些数学公式、数列、树等的定义是递归的。
2. 数据结构是递归的
比如单链表就是一种递归的数据结构。
3. 问题的求解方法是递归的
比如汉诺塔问题。
通常,一个递归模型是由递归出口和递归体两部分组成的。前者确定递归到何时结束;后者确定递归求解时
的递推关系。递归思路是把一个不能或不好直接分解的“大问题”转换为一个或几个“小问题”来解决,再
把这些“小问题”进一步分解为更小的“小问题”来解决,如此分解,直至每个“小问题”都可以直接解决
(此时分解到递归出口)。递归的分解不是随意的分解,递归分解要保证“大问题”和“小问题”相似,即
求解过程和环境都相似;并且有一个分解的终点。
递归算法的执行过程分为递推和回归两个阶段。在递推阶段,把较复杂的问题的求解(规模为n)推到比原问
题简单一些的问题(规模小于n)的求解。在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复
杂问题的解。
递归与非递归的转换:
递归算法有两个基本的特性:
一是对求解某些复杂问题,递归算法分析问题的方法十分有效;
二是递归算法的时间/空间效率通常比较差。
把递归算法转换为非递归算法有以下三种基本方法。
(1)通过分析,跳过分解过程,直接用循环结构的算法实现求值过程。
比如斐波那契数列递归算法的改写。
(2)用栈模拟系统的运行时,只保存必须保存的信息,从而用非递归算法替代递归算法直接使用栈保存中间
结果,从而将递归算法转化为非递归算法的过程。
(3) 利用栈保存参数,由于栈的后进先出的特性符合递归算法的执行过程,可以用非递归算法替代递归算法。