c语言递归解决汉诺塔问题

汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。blog

上帝创造世界时做了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,上帝命令婆罗门把圆盘从下面开始按大小顺序从新摆放到第二根柱子上,递归

而且规定,每次只能移动一个圆盘,在小圆盘上不能放大圆盘。(即借助C把A上的圆盘移到B,而且从上到下圆盘增大)io

#include<stdio.h>变量

void Hanoi(int n, char A, char B, char C)
{
if (n == 1)   #若是只有一个直接从A移到B
{
printf("Move %d: from %c to %c\n",n,A,B);
}
else
{
Hanoi(n - 1, A, C, B);   #把n-1个从A移到C借助B
printf("Move %d: from %c to %c\n",n,A,B);
Hanoi(n - 1, C, B, A);   #把n-1个从C移到B借助A
}
}
int main()
{
int n;
char A = 'A';#定义ABC表示三个柱子
char B = 'B';
char C = 'C';
printf("Input the number of disks:");
scanf("%d", &n);
printf("Steps of moving 3 disks from A to B by means of C:\n");
Hanoi(n, A, B, C);
return 0;
}原理

 

/*根据上面的原理 增长一个计数器,并将步骤打印出来*/方法

#include<stdio.h>
int i = 1;//定义全局变量,每次调用后加1
void Hanoi(int n, char A, char B, char C)
{
 
 if (n == 1)//若是只有一个直接从A移到B   "%2d-(%2d):%c==>%c\n"
 {
  printf("%2d-(%2d):%c==>%c\n",i++,n,A,B);
  
 }
 else
 {
  Hanoi(n - 1, A, C, B);//把n - 1个从A移到C借助B
  
   printf("%2d-(%2d):%c==>%c\n", i++, n, A, B);
  Hanoi(n - 1, C, B, A);//把n - 1个从C移到B借助B
  
 }
 
}
int main()
{
 int n;
 char A = 'A'; //定义ABC表示三个柱子
  char B = 'B';
 char C = 'C';
 printf("Please enter the number of discs:");
 scanf("%d", &n);
 Hanoi(n, A, B, C);
 printf("\tTotal:%d\n",--i);
 return 0;
}im

相关文章
相关标签/搜索