基本操作:元素输出
递归方程:
得到 。
算法的运行时间: 。
每一次递归需常数个工作单元,递归深度为 ,递归栈的空间为 。
例 5:整数划分问题
将正整数 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。
分析:
(1) q(1,m)=1;
(2) q(n,m)=q(n,n),m>n;
最大加数 n1 实际上不能大于 n。因此,q(1,m)=1。
(3) q(n,n)=1+q(n,n-1);
正整数 n 的划分由 n1=n 的划分和 n1≤n-1 的划分组成。
(4) q(n,m)=q(n,m-1)+q(n-m,m),n>m>1;
正整数 n 的最大加数 n1 不大于 m 的划分由 n1=m 的划分和 n1≤n-1 的划分组成。
算法分析
前面的几个例子中,问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。在本例中,如
果设 p(n)为正整数 n 的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数 n1 不大于 m 的
划分个数记作 q(n,m)。可以建立 q(n,m)的如下递归关系。
正整数 n 的划分数 p(n)=q(n,n)。
例 6 Hanoi 塔问题
设 a,b,c 是 3 个塔座。开始时,在塔座 a 上有一叠共 n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆
盘从小到大编号为 1,2,…,n,现要求将塔座 a 上的这一叠圆盘移到塔座 b 上,并仍按同样顺序叠置。在移动圆盘时
应遵守以下移动规则:
规则 1:每次只能移动 1 个圆盘;
规则 2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则 3:在满足移动规则 1 和 2 的前提下,可将圆盘移至 a,b,c 中任一塔座上。
分析:在问题规模较大时,较难找到一般的方法,因此我们尝试用递归技术来解决这个问题。
当 n=1 时,问题比较简单。此时,只要将编号为 1 的圆盘从塔座 a 直接移至塔座 b 上即可。
当 n>1 时,需要利用塔座 c 作为辅助塔座。此时若能设法将 n-1 个较小的圆盘依照移动规则从塔座 a 移至
塔座 c,然后,将剩下的最大圆盘从塔座 a 移至塔座 b,最后,再设法将 n-1 个较小的圆盘依照移动规则从塔座 c