1. 程式人生 > 其它 >利用遞推思想解決漢諾塔問題

利用遞推思想解決漢諾塔問題

技術標籤:c語言

利用遞推思想解決漢諾塔問題

漢諾塔問題是一個比較經典的利用遞推思想來解決的問題。在這裡插入圖片描述
這是一張來自百度百科的一張圖片。
我們需要利用B杆將A杆上的所有東西放到C杆上面。而且放置事物的時候只能是大的在下面,小的在上面。每一次移動只能移動一個物塊。
我們假設有N個物塊在A杆子上面。為了保證把全部的N個物塊放到C杆子上去,我們就必須先讓第N塊放到C杆子的最下面。這樣才能保證所有物塊保證,下面的永遠比上面的大。
那我們在移動第N塊的時候,(N — 1)個物塊必須先暫時放到B杆子處。
我們依次往上類推,(N — 1)這個物塊為了放到C杆子上時,(N — 2)個物塊就必須放到B杆上。以此往復,第二個物塊為了放到C杆子上,第一個物塊就必須先放到B杆子上。

第二個物塊放好之後,第三個物塊也想去C杆子上,第二個物塊只能利用A杆讓自己從C杆子放到B杆子。
至於怎麼放,我們只需要把第B上的第一物塊放到A上,第2物塊就能放到B杆子上面了。第一物塊放到B杆子上面。(這個步驟我們不必體現在程式碼上,我們只需要知道,我們借用A杆,將C杆子上的東西放到B杆子上。)
那我們持續好上面的步驟之後,我們發現,前(N — 1)個物塊全部都在B杆子上面了。那我們就要把A杆子上的第N個物塊放到C杆子上。之後,我們遇到的問題就是,怎麼把B杆子上的(N — 1)個物塊放到C杆子上去。
那我們可以想象,此時的B杆子是不是像極了一開時的A杆子呢?只是比當時的A杆子少了一個物塊。那我們就需要依照上面的思想借助A杆子放到C杆子上面。
我們化成步驟就是:
一:藉助C杆子把第N塊之前的(N — 1)個物塊放到B杆子上。
二:將A杆子上的第N塊放到C杆子上去。
三:假想現在的B杆子是最開始的A杆子,我們需要藉助A杆子把B杆子上面的(N — 1)個物塊放到C杆子上面。

#include <stdio.h>
int bz = 1;                                //利用全域性變數,計算是第幾個步驟。 
void yd(int N, char k, char e)             //列印顯示函式的定義。變數N表示是第幾個物塊,變數k表示物塊一開始所處在的位置,變數e表示的是物塊要去的地方 
{ printf ("步驟:%d :第 %d個物塊從 %c 到 %c\n", bz++ , N , k , e); //要列印的內容。 } void hnt(int n, char A, char B, char C) //漢諾塔解決的函式體現 { if (n == 0) //如果輸入的是0,那麼就是返回0; return; hnt(n - 1 , A , C , B); // 體現的是第一步A杆子上面的東西,通過C杆子放到B杆子上面。 yd(n , A , C); //利用上面的函式來列印移動的情況。 其中的A 和C表明的把A杆子上的東西放到C杆子上去,體現了第二步 hnt(n - 1 , B , A , C); //體現的第三部步,利用A杆子將B杆子上面的東西放到C杆子上去。 } int main() { int n = 0; //定義物塊的多少 scanf ("%d", &n); hnt(n, 'A', 'B', 'C'); //套用函式 return 0; }