汉诺塔和N皇后问题算是计算机中经典的递归算法问题了。几乎讲到递归的时候都会想到这两个问题,那么我们就来看一下这两个经典的递归问题:
首先来看一下汉诺塔问题,汉诺塔源于一个古老的印度传说:
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
当然我们不是来听故事的,我们将这个描述构造成计算机问题:
有三根柱子,这里编号为 A 、 B 、 C,一开始在A柱子上有从下往上按照从大到小顺序摆放的64个圆盘,给的任务是将这些圆盘以同样的大小顺序摆放到C柱子上,可以借助任何柱子作为中转,但是限制条件是:
1.在小圆盘上不能放大圆盘。
2.在三根柱子之间一回只能移动一个圆盘。
3.只能移动在最顶端的圆盘。
怎么解决呢?我们先假定A柱子上面的圆盘个数为2个,这里为了方便表述将圆盘编号为a、b(a圆盘在上面,b圆盘在下面),那么就先将a从A柱子移动到B柱子上面,再将b从A柱子移动到C柱子上面,再将a从B柱子移动到C柱子上面,这样就完成了,总共移动了3次圆盘。
接下来假定圆盘数为3个(编号为a、b、c),我们继续,移动步骤如下:
a(A)—> C // A柱子上的圆盘a从A柱子移动到C柱子,下同
b(A)—> B
a(C)—> B
c(A)—> C
上面是第一轮,接下来是第二轮:
a(B)—> A
b(B)—> C
a(A)—> C
我们观察:当A柱子或者B柱子只剩下一个圆盘的时候,就直接将这个圆盘移动到C柱子,上面步骤的第一轮就是先将A柱子上面的n-1(假设A柱子一共有n个圆盘)个圆盘借助其它柱子按照同样的大小顺序移动到B柱子(第一轮)这样B柱子上面就有n-1个圆盘,然后将A柱子上面的最后一个最大的圆盘直接移动到C柱子上面,接下来是将B柱子上面的n-1个圆盘借助其它柱子按照同样的大小顺序移动到C柱子上面(第二轮)。之后重复这两轮操作,直到圆盘全部转移到C柱子上。
下面直接给出源程序:
#include <iostream>
using namespace std;
int n; // 总的圆盘数
int sum; // 移动的总次数
void hanoi(int n, char A, char B, char C) // 将A柱子上面的圆盘移动到C柱子
{
if(n == 1) //如果A柱子上面只有一个柱子,那么直接移动
{
cout <<