1. 程式人生 > >經典遞迴演算法 漢諾塔

經典遞迴演算法 漢諾塔

函式的遞迴 前進(規模縮小),邊界條件,返回段,自己呼叫自己
在寫漢諾塔之前 先給大家介紹下遞迴演算法 舉個例子:我要寫一個我自己的列印函式
Myprint()將12345 這個數 挨個數字 打印出來

void MyPrint(int n)
{
    if(n > 10)
		MyPrint(n/10); 

   printf("%d ",n%10);
}

就像上面程式碼塊中 呼叫自己來解決問題的方式

漢諾塔中有三個柱子a,b,c
在這裡插入圖片描述
如果a上面只有一個鉛塊 那麼直接把鉛塊從a挪到c就好了;
如果鉛塊較多就會出現以下情況
在這裡插入圖片描述
在挪動的過程中肯定會把上面的鉛塊通過 c來放到b上去 好讓最大的塊放到c上面 ;然後再通過c把b上面除了最後一塊放到a上面去把b上面最大的放到c上 依次類推;

int g_count = 0;
void Move(char x,char y)    //通過寫軌跡函式來記錄漢諾塔移動的過程
{
	g_count++;          //記錄移動次數
	printf("%c->%c\n",x,y);
}

void Hanoi(int n,char a,char b,char c)
{
	if(n == 1)
	{
		Move(a,c);
	}
	else
	{
		Hanoi(n-1,a,c,b);    // 通過c把n-1的磚塊從a挪到b
		Move(a,c); 			//把最大的那塊挪到c上
		Hanoi(n-1,b,a,c);  // 通過a把n-1的磚塊從b挪到c
	}
}
int main()
{
	Hanoi(5,'A','B','C');
	printf("%d\n",g_count);
	return 0;
}

程式執行結果:
在這裡插入圖片描述
佛教傳說64個黃金圓盤移動完 宇宙就會毀滅。。。
大家可以試試64個圓盤的結果;
執行完不會毀滅吧。。。