在数据结构中,很多内容都应用到递归,递归在数据结构中至关重要
递归定义:一个函数、概念或数学结构,如果在其定义或说明内部直接或间接地出现对其本身的引用,或者是为了描述问题的某一状态,必须要用至它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或递归定义。在程序设计中,函数直接或间接调用自己,就被称为递归调用。
递归的几个特点
1.递归式,就是如何将原问题划分成子问题。
2.递归出口,递归终止的条件,即最小子问题的求解,可以允许多个出口。
3.界函数,问题规模变化的函数,它保证递归的规模向出口条件靠拢
递归算法基本设计套路:
1、分析问题, 设计递归公式或者算法步骤将一个问题化解为一个或多个子问题求解, 且子问题和原问题具有相同的解法,然后合并各个子问题成原始问题的解。
2、设计递归结束条件控制递归,递归最后一级的调用必须不能再进行递归。保证算法的有穷性。
3、确定参数,设计递归函数递归过程或递归函数的参数值在递归过程中必须是按规律变化的,且参数值的增或减方向应与递归终止条件相匹配, 这样才能控制递归调用。
一般简单递归函数设计的格式为:
if ( 递归结束条件)
return ( 结束递归时的返回值);
else
return ( 递归表达式);
递归算法的基本模式 (用于求解问题)
//递归算法的框架:
f(n)
{ n=1:
f(1) … (直接求解);
n>1:
(递归)求解f(k)…(k<n)
//并利用f(1)、…、f(n-1)求得f(n)…;
}
注:一般来说,求f(k)(k<n)比求f(n)要容易,
关键在于要有办法由f(1)、…、f(n-1)得到f(n) 。归纳原理进行判断。
1.
先处理一些特殊情况
——
这也是递归函数的第一个出口,即递归中止条件:基础步。(递归基)
2.
再处理递归关系
——
这形成递归函数的第二个出口。即
归纳步:即怎么调用子问题求解原始问题步。
看到一篇好文章: