遞迴演算法與兩個經典問題 漢諾塔問題和八皇后問題

2021-07-24 20:35:53 字數 1065 閱讀 3797

函式在其函式體裡又包含對其自身的呼叫,稱為遞迴。例如階乘函式f(n)就可以用遞迴表示為

int f(int n)

else

}

而其非遞迴表示為

int g(int n)

else

return s;

}}

可見非遞迴表示要複雜一些,對於更為複雜的問題,則更是如此,如以下所述的漢諾塔問題。

傳說在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅。其實,如果每秒移動一塊金片,移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。我們現在通過輸入金片數m(如m=3),希望得到解決方案,三根柱子分別用a,b,c表示,其中a是原柱,c是目標柱,b是輔助柱。遞迴實現:

void hanoi(int n ,char x,char y,char z)

非遞迴實現(主函式與遞迴實現相同,這裡略去)

define maxstack 100;

structh;

structhstack;

void commonhanoi(int n,char a,char b,char c), m = 0;

bool check(int x, int y)

} return true;

}void count(int i)

count(i + 1);

octqueen[i] = 0;

} }}int main(int argc, char*argv)

經典遞迴問題 漢諾塔

漢諾塔 漢諾塔問題第一次接觸時就感覺非常有趣,但是由於當時知識有限不能深刻地理解遞迴的含義,所以沒能繼續深究,現在來談一談吧。題目描述 漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在...

經典問題 漢諾塔(遞迴)

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

經典遞迴 漢諾塔問題

有三個柱子,三個盤子都在第乙個柱子上,現在要移到第三個柱子上,要求移動過程中盤子相對位置不變,小的還是在上,大的在下。思路 分兩步 1.將n 1個盤從乙個柱子移到另乙個柱子 借助另外乙個柱子 n 1 2.將1個盤子從乙個柱子移到另乙個柱子 用3個柱子移動n 1個盤子,目的 把所有盤子從x移到z vo...