/*汉诺塔的玩法:
* 游戏的规则:将A柱上的盘子移动到C柱上,大盘必须在小盘之上。
* 1 当A柱上只有一个盘子的时候,直接移动到C柱上;
* 2 当A柱上有两个盘子的时候,
* 将A柱上的1盘(从上到下编号)移动到B柱,
* 将A柱上的2盘移动到C柱,
* 将B柱上的1盘移动到C柱;
* (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱)
* 3 当A柱上有三个盘子的时候,将A柱上的1~2盘移动到B柱,
* 将A柱上的3盘移动到C柱,
* 将B柱上的1~2盘移动到C柱
* (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱)
* n 当A柱上有n个盘子的时候,将A柱上的1~n-1盘移动到B柱,
* 将A柱上的n盘移动到C柱,
* 将B柱上的1~n-1盘移动到C柱。
* (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱)
* */
1 #include<stdio.h> 2 3 void Hanoi(int count,char a,char b,char c){ 4 if(count == 1){ 5 printf("FROM %c TO %c\n",a,c); 6 }else 7 { 8 Hanoi(count-1,a,c,b); 9 printf("FROM %c TO %c\n",a,c); 10 Hanoi(count-1,b,a,c); 11 } 12 } 13 int main(){ 14 printf("please input the number of Hanoi:"); 15 int n; 16 scanf("%d",&n); 17 Hanoi(n,‘A‘,‘B‘,‘C‘); 18 return 0; 19 }
通常系统通常在一个函数运行期间调用另一个函数时,在运行被调用的函数之前,系统需要做3件事:(1)将所有的实参,返回地址等信息传递给被调用的函数保存。(2)为被调用的函数的局部变量分配存储区。(3)将控制转到被调用的函数的入口。从而在被调用的函数返回调用函数之前,系统通常也要做3件事:(1)保存被调函数的计算结果(2)释放被调函数的数据区(3)依照被调函数保存的返回地址将控制返回到调用函数。当有多个函数嵌套调用,按照先调用的后返回的原则,上述函数之间的信息传递和控制的转移必须必须通过栈来实现,即系统见整个程序运行期间的所需要的数据空间安排在一个栈中,每当调用一个函数就为它在栈顶分配一个存储区,每当一个函数退出运行时,就释放他的存储区,则当前正在运行的函数的数据必须是在栈顶的。递归函数的执行过程相当于多个韩式的嵌套调用,只是调用函数和被调用的函数是同一个函数。为了保证递归函数的正确进行,系统设立了一个递归工作栈作为真个递归函数运行期间使用的数据存储区,每一层递归所需的信息构成一个“工作记录”。其中包括所有的上一层的返回地址,所有的局部变量和实在的参数。每当进入一层递归,就产生一个新的工作记录压入栈顶,每当退出一层递归,就从栈顶弹出一项工作记录。
void Hanoi(int count,char a,char b,char c)
1 {
2 if(count == 1)
3 printf("FROM %c TO %c\n",a,c);
4 else{
5 Hanoi(count-1,a,c,b);
6 printf("FROM %c TO %c\n",a,c);
7 Hanoi(count-1,b,a,c);
8 }
9 }
下表给出了递归的执行过程,返回地址是程序中的代码的行号,主函数的地址为0;