C語言遞迴 (漢諾塔問題)

2021-10-17 07:14:34 字數 1927 閱讀 9255

漢諾塔(tower of hanoi),又稱河內塔,是乙個源於印度古老傳說的益智玩具。

大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序

摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另

一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動

乙個圓盤。

序呼叫自身的程式設計技巧稱為遞迴( pecursion )。遞迴做為一種演算法在程式設計

語言中廣泛應用。乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一

種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小

的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複

計算,大大地減少了程式的**量。遞迴的主要思考方式在於:把大事化小

·存在限制條件,當滿足這個限制條件的時候,遞迴便不再繼續。

·每次遞迴呼叫之後越來越接近這個限制條件。

漢諾塔遊戲規則

遊戲裡有三根柱子(a柱)(b柱)(c柱),在a柱上從下往上按大小順序排著圓盤

玩家需要做的是把圓盤從下面開始按大小順序重新擺放在c柱上面。並且規定,在小

圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。(如圖)

根據規則我們知道n為1的時候,我們只需要把a柱的圓盤移到c柱上。

但n>1時,我們需要將n-1的圓盤的圓盤移動到b柱上,在將a柱剩餘最大的乙個圓盤移動到c柱上,最後將b柱上的圓盤移動到c柱上。

我們先把漢諾塔所需要的值定義出來,n是圓盤,a,b,c分別對應的是三根柱子,hanoi函式實現盤子移動的過程。

int count =0;

//計數器(全域性變數)

intmain()

我們根據上面圓盤n為1**時知道,n為1時把a柱上剩的最後乙個圓盤移到c柱上,我也將此作為遞迴的出口,防止遞迴不受控制,move函式實現列印移動圓盤時的路徑

void

move

(int n,

char a,

char c)

void

hanoi

(int n,

char a,

char b,

char c)

當n>1時候,我們借助c柱把a柱上n-1個圓盤移動到b柱上

else

}

此時a柱上就剩最後乙個最大的圓盤,然後將這個圓盤移動到c柱上

然後再借助a柱把b柱上n-1個圓盤移動到c柱上,最後實現從a柱的圓盤移動到c柱去

C語言遞迴實現漢諾塔問題

剛剛學習漢諾塔問題想要快速上手的話也可以理解為由三個柱構成 具體到函式裡下面的注釋裡有寫。在使用遞迴前我們首先要知道什麼是遞迴 程式呼叫自身的程式設計技巧稱為遞迴 recursion 遞迴的作用 遞迴做為一種演算法在程式語言中廣泛應用。乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它...

C語言遞迴解決漢諾塔問題

法國數學家愛德華 盧卡斯曾編寫過乙個印度的古老傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只移動一片,...

漢諾塔問題(遞迴)

題目描述 對於傳統的漢諾塔遊戲我們做乙個拓展,我們有從大到小放置的n個圓盤,開始時所有圓盤都放在左邊的柱子上,按照漢諾塔遊戲的要求我們要把所有的圓盤都移到右邊的柱子上,請實現乙個函式列印最優移動軌跡。給定乙個int n,表示有n個圓盤。請返回乙個string陣列,其中的元素依次為每次移動的描述。描述...