Hanoi:";cin>>n;cout<<"Answer:"<<endl;hanoi(n,'A','B','C');}函数递归调用的应用与分治策略许多算法都采用了分治策略求解,而可以说分治与递归是一对孪生兄弟,它们经常同时被应用于算法的设计中。下面讨论著名的Catalan数问题,人们在对它的研究中充分应用了分治策略。[例4]Catalan数问题。[问题描述]一个凸多边形,通过不相交于n边形内部的对角线,剖分为若干个三角形。求不同的剖分方案总数H(n)。H(n)即为Catalan数。例如,n=5时H(5)=5。[分析]Catalan数问题有着明显的递归子问题特征。在计算Catalan数时虽然可以推导出只关于n的一般公式,但在推导过程中却要用到递归公式。下面讨论三种不同的解法,其中第三种解法没有使用递归,它是由前两种解法推导而出的。[解法1]对于多边形V1V2…Vn,对角线V1Vi(i=3,4,…,n-1)将其分为两部分,一部分是i边形,另一部分是n-i
1边形。因此,以对角线V1Vi为一个剖分方案的剖分方案数为H(i)*H(n-i 1)。还有一种的特殊情形,是对角线V2Vn将其分为一个三角形V1V2Vn和一个n-2 1边形。为了让它同样符合粗体字给出的公式,规定H(2)=1。于是得到公式:H(n)=∑H(i)*H(n-i
1)(i=2,3,…,n-1)----公式(1)H(2)=1有了这个递归关系式,就可以用递推法或递归法解出H(n)。[解法2]从V1向除了V2和Vn外的n-3个顶点可作n-3条对角线。每一条对角线V1Vi把多边形剖分成两部分,剖分方案数为H(i)*H(n-i
1,t);}}[例6]“九宫阵”智力游戏。[问题描述]一个9×9方阵,由9个“九宫格”组成,每个九宫格又由3×3共9个小格子组成。请在每个空白小格子里面填上1~9的数字,使每个数字在每个九宫格内以及在整个九宫阵中的每行、每列上均出现一次。(1)编程将下面图中的九宫阵补充完整。(2)讨论是否可能给出“九宫阵”的全部解?
注意斜体的“a[i,j]:=0”必不可少!当对某个结点(x,y)扩展的过程中,可能在扩展到(x m,y n)时它的子树被完全杀死(每个结点都被杀死,亦即按照(x,y)及之前的填数方案填数,无解)。这时需要保证(x,y)以后所填的数被重新置零,这个语句的作用即在每个结点被杀死时都将其置零。将伪代码翻译为C
递归方法在算法与数据结构中的应用无所不在,如动态规划(状态方程)、回溯法(深度优先搜索)等等,以上两例只是冰山一角。只有熟悉掌握函数递归调用的编程方法,深入理解分治策略的重要思想,才能编写出功能强大、高效简明的程序。="msonormal"style="margin:0cm0cm0pt">