时隔七个月,我终于弄懂了汉诺塔的思想
目錄
1.問題描述
2.漢諾塔的分析
3.博主的反思
4.代碼詳解
- 博主在大一的上學期開學沒多久看的漢諾塔,在看的過程中,很多地方似懂非懂,但是博主當時沒有細品,便匆匆跳過,直到最近感覺自己遞歸學的不行便又復習一下,果然有了很多的收獲
1.問題描述
在印度,有這么一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的圣廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片,1. 一次只移動一片; 2. 不管在哪根針上,小片必在大片上面。當所有的金片都從梵天穿好的那根針上移到另外一概針上時,世界就將在一聲霹靂中消滅,梵塔、廟宇和眾生都將同歸于盡。
2.漢諾塔的分析
假設我們要把A柱子上的金片移動到B柱子上。如果漢諾塔的A柱子有2個金片,那么就是把最上邊的哪一個金片移動V柱子上,再把A上面的另一個金片移動到B柱子上,再把V柱子上的金片移動到B柱子上,就完成了工作。
如果有3個就是把上邊的第一個金片(最小的)放在B柱子上,第二個金片放在V柱子上,再把第一個金片從B柱子移動到V柱子上,然后把第三個金片(最大的金片)放在B柱子上,再把V柱子上的第一塊金片放在A柱子上,再把V柱子上的第二塊金片放在B柱子上,最后把A柱子上的第一片金片放在B柱子上,就完成了工作
其實仔細想想只要兩個或者兩個以上的金片都可以這么看,假如有n(n>=2)個金片,那么其實就只有三步,第一步把上面n-1個金片從A柱子放在V柱子上,把最大的金片放在B柱子上,最后把V柱子上的n-1塊金片移動到B柱子上,這就完成了(我們先不管他怎么實現把n-1塊金片從一個柱子移動到另一個柱子)。我們把做完第二步的狀態分析一下:此時,最大的金片在B柱子上,n-1塊金片在V柱子上,由于B柱子上是最大金塊,所以可以把B柱子上的金塊看作沒有(其他n-1塊金片都比他小,都能放在這塊最大的金片的上面),那么此時又回到了原來的問題,現在是只有n-1塊金片把它從V柱子移動到B柱子上(只是金片所在的初始位置的柱子變了而已),依次類推,是不是重復了n次同樣的操作把所有的金片從A柱子移動到了B柱子
3.博主在學習漢諾塔遇到的問題
博主比較笨,主要是博主過分的把重心放在代碼的實現上,導致博主剛開始看的時候無法理解,但是漢諾塔遞歸其實就是重復做一件事情,我們不用去管它到底是怎樣把B柱子作為輔助,把n-1塊金片從A柱子移動到V柱子上,這是遞歸內部的實現,我們只需要知道他就是在做同一件事情就行
4.代碼詳解
#include<stdio.h> int hanio(int n,char A,char V,char B) {if(n==1)printf("%c->%c\n",A,B);else{hanio(n-1,A,B,V);//把A柱子的n-1塊金片移動到Vprintf("%c->%c\n",A,B);//最大的那一塊金片移動到Bhanio(n-1,V,A,B);//把V柱子的n-1塊金片移動到B} } int main() {hanio(2,'A','V','B'); }運行結果
總結
以上是生活随笔為你收集整理的时隔七个月,我终于弄懂了汉诺塔的思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性表应用之线性表算法设计六大经典案例
- 下一篇: 用栈实现进制的转换