漢諾塔(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