递归的概念用函数直接或间接地调用自身的算法称为递归算法。自身给出定义的函数称为递归函数由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对李生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。下面来看几个实例。6niversity of cience andTechnology of China
6 University of Science and Technology of China 递归的概念 ⚫ 直接或间接地调用自身的算法称为递归算法。用函数 自身给出定义的函数称为递归函数。 ⚫ 由分治法产生的子问题往往是原问题的较小模式,这 就为使用递归技术提供了方便。在这种情况下,反复 应用分治手段,可以使子问题与原问题类型一致而其 规模却不断缩小,最终使子问题缩小到很容易直接求 出其解。这自然导致递归过程的产生。 ⚫ 分治与递归像一对孪生兄弟,经常同时应用在算法设 计之中,并由此产生许多高效算法。 下面来看几个实例
递归的例子例1阶乘函数阶乘函数可递归地定义为:边界条件n=01nl=n(n - 1)!n>0递归方程边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。niversity of Science andTechnology of China
7 University of Science and Technology of China 递归的例子 例1 阶乘函数 阶乘函数可递归地定义为: 0 0 ( 1)! 1 ! = − = n n n n n 边界条件 递归方程 边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果
递归的例子例2排列问题设计一个递归算法生成n个元素(r1,2….,r,)的全排列。设R={r1,r2....,rn)是要进行排列的n个元素,R;=R-{ri]。集合X中元素的全排列记为perm(X)。(r)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。R的全排列可归纳定义如下:当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;当n>1时,perm(R)由(r)perm(R1),(r2)perm(R2),...(rr)perm(R.)构成Xniversity of cience and Technology of China
8 University of Science and Technology of China 递归的例子 例2 排列问题 设计一个递归算法生成n个元素{r1 ,r2 ,.,rn }的全排列。 设R={r1 ,r2 ,.,rn }是要进行排列的n个元素,Ri=R-{ri }。 集合X中元素的全排列记为perm(X)。 (ri )perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1 )perm(R1 ),(r2 )perm(R2 ),., (rn )perm(Rn )构成
递归的例子例3整数划分问题将正整数n表示成一系列正整数之和:n=n1+n2+...+nk其中n≥nz≥...≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。例如正整数6有如下11种不同的划分:6 ;5+1 ;4+2,4+1+1 ;3+3,3+2+1,3+1+1+1 2+2+22+2+1+1,2+1+1+1+1 ;1+1+1+1+1+1。9niversity of Science and Technology of China
9 University of Science and Technology of China 递归的例子 例3 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+.+nk, 其中n1≥n2≥.≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。 例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1
递归的例子例3整数划分问题前面的几个例子中,问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关索,茵此考虑增翁一个省量:将最关茄数n1不天芋m的划分金个数记作q(n,m)。可以建立q(n,m)的如下递归关系。(3) q(n,n)=1+q(n,n-1);正整数n的划分由n1=n的划分和ni≤n-1的划分组成(4) g(n,m)=g(n,m-1)+g(n-m,m),n>m>1;正整数n的最大加数n,不大于m的划分由n1=m的划分和ni≤m-1 的划分组成。10niversity of Science andTechnology of China
10 University of Science and Technology of China 递归的例子 (2) q(n,m)=q(n,n),mn; 最大加数n1实际上不能大于n。因此,q(1,m)=1。 (1) q(n,1)=1,n1; 当最大加数n1不大于1时,任何正整数n只有一种划分形式, 即 n n = 1+1+ +1 (4) q(n,m)=q(n,m-1)+q(n-m,m),n>m>1; 正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1≤m-1 的划分组成。 (3) q(n,n)=1+q(n,n-1); 正整数n的划分由n1=n的划分和n1≤n-1的划分组成。 例3 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分 个数记作q(n,m)。可以建立q(n,m)的如下递归关系