C语言经典递归题——汉诺塔
涉及知识:变量-形实参--函数-判断-递归
一、介绍
汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,
其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二、题目
现有三根杆子A, B, C。
A杆上有N个(N>1) 穿孔圆盘, 盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:
1.每次只能移动一个圆盘
2.小圆盘上不能放大圆盘
可将圆盘临时置于B杆, 也可将从A杆移出的圆盘重新移回A杆, 但都必须尊循上述两条规则。求移动的过程。
画图分析:
当有2个盘时移动过程为:
A->B A->C B->C
- 将 A 座上 1 个盘子移到 B 座上
- 将 A 座上 1 个盘子移到 C 座上
- 将 B 座上 1 个盘子移到 C 座上
当有3个盘子时移动过程为:
A ->C A->B C->B A->C B->A B->C A->C
- 将 A 座上 2 个盘子移到 B 座上(借助 C)
- 将 A 座上 1 个盘子移到 C 座上
- 将 B 座上 2 个盘子移到 C 座上(借助 A)
由此可以推出:移动 n 个盘子要经历 2 n次方-1 步。当有n个圆盘时,可以先借助c柱子把较小的n-1个圆盘全都移动到b柱子上,再把a柱子上剩下的最大的一个圆盘移动到c柱子上。这时候b柱子上有n-1个圆盘,需要再借助a柱子把剩下的n-1个圆盘移动到c柱子上,其实就相当于a柱子上有n-1个圆盘的情况。这样就可以用递归的方法来求解。
接下来我们来看代码
#include<stdio.h>
void move(int n,char x, char y)
{ //输出移盘方案
printf("第%d个圆盘%c-->%c\n",n,x,y); //这里n代表第几个圆盘,第一个为最上面的圆盘,第n个为最底部的圆盘
} //x,y代表A,B,C座之一,根据每次的不同情况分别取A,B,C代入
int count=0; //声明全局变量count
int Hanoi(int n,char a,char b,char c)//n个圆盘从起始座a移动到目标座c,b作为其中的中介座
{
if( n==1 )
{
move(n,a,c);
count++;
return count;
}
else
{
Hanoi(n-1,a,c,b); //将A杆上n-1个圆盘从起始座a移动到目标座b,c作为中介座
move(n,a,c);
count++;
Hanoi(n-1,b,a,c); //将B杆上n-1个圆盘再从起始座b移动到目标座c,a作为中介座
}
}
int main()
{
char x='A';
char y='B';
char z='C';
int num=0;
printf("请输入圆盘个数:");
scanf("%d",&num);
printf("以下是移动的过程:\n");
Hanoi(num,x,y,z);
printf("总共移动%d步\n",count);
return 0;
}
以上就是经典递归题汉诺塔