法國數學家愛德華·盧卡斯曾編寫過乙個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
分為3個步驟:
此時我們思考乙個問題:我們第64個盤子是不是最大?它是不是已經永遠不會動了?
所以我們是不是可以直接把這個東西看作沒了?給我回答「是」,要不然我講不下去。
**裡面的這一步是:hanio(n-1, y , x , z);
我的理解是:現在我們把第64個盤子看做沒了,是不是原本的問題變成了63個盤子,和最初的區別是一開始的64個盤子都在x上面,現在都在y上面,所以我們把y當成x去處理不就好了呀。
可以**一下**的執行:
n=3n=2
x —> z
x —> y
z —> y
x —> z
y —> x
x —> y
y —> z
x —> z
x —> z
y —> z
發現沒?其實n=3時的後面三步,其實和n=2時的步驟是一樣的,只不過x變成了y,x變成了y。
這就是**中的這一步交換位置的原理所在。
將62個盤子從y移動到x
將第63個盤子移動到y
將62個盤子移動到y
將62個盤子從y移動到x
將第63個盤子移動到z
將63個盤子移動到y上
下面貼出**:
#includevoid hanio(int n, char x ,char y ,char z)
} int main(int argc, char const *argv)
一臉懵逼的Socket http對比
標籤 空格分隔 http tcp 今天整理一下已經懵逼好久的socket,http。想要弄清出他們的區別,首先要弄清一下tcp ip協議。每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的 這樣...
基礎演算法系列 之斐波那契和漢諾塔
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家萊昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 漢諾塔 tower of hanoi 又稱河內塔,是...
遞迴演算法之漢諾塔的實現
乙個印度的古老傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只移動一片,不管在哪根針上,小片必須在大片上...