递归的求解过程均有这样的特征:先将整个问题划分为若干个子问题,通过分别求解子问题,最后获得整个问题的解。而这些子问题具有与原问题相同的求解方法,于是可以再将它们划分成若干个子问题,分别求解,如此反复进行,直到不能再划分成子问题,或已经可以求解为止。这种自上而下将问题分解、求解,再自上而下引用、合并,求出最后解答的过程称为递归求解过程,这是一种分而治之的算法设计方法。
(1)简单递归算法设计方法
对于比较简单的递归算法,其一般设计步骤如下:
对原问题f(s)进行分析,假设出合理的"较小问题"f(s')。
假设f(s')是可解的,在此基础上确定f(s)的解,即给出f(s)与f(s')之间的关系。
确定一个特定情况(如f(1)或f(0))的解,由此作为递归出口。
(2)复杂递归算法设计方法
递归问题的参数构成了递归状态。对于较复杂的递归问题,常常采用试探方法。假设递归求解过程从状态s0到状态sn,求解的一般步骤如下:
假设当前状态为si,将si的环境设置为已处理过。
求出从si出发可以到达的某状态sj,若sj=sn,输出一个解;否则递归调用sj,表示从sj开始处理。
若从si出发不能到达任何状态,则回溯,将si的环境设置为未处理过(称为恢复环境)。