在網路上關於漢諾塔的實現模板中,總是出現乙個move的函式;典型實現如下:
class solution
void move(int n, vector& a, vector& b, vector& c)
move(n-1, a, c, b); // 將a上面n-1個通過c移到b
c.push_back(a.back()); // 將a最後乙個移到c
a.pop_back(); // 這時,a空了
move(n-1, b, a, c); // 將b上面n-1個通過空的a移到c
}};
如果考察漢諾塔遞迴函式的定義:即將n個盤子從a 移動到c,中間通過b 的幫助來實現;初始時a是n個盤子,b,c都是空的;轉移完成後a,b是空的,c是n個盤子;
那麼我們可不可以不通過move函式而直接通過hanota函式來呼叫自己來實現呢?即將**寫成如下的形式:
class solution
int temp=a[a.size()-1];
vectora(a.begin(),a.end()-1);
a.assign(a.begin(),a.end());
hanota(a,c,b); //將前n-1個盤子先送到b上;
c.insert(c.begin(),temp); //將最後乙個盤子送到c
a.clear(); //保證helper初始時是空的;
hanota(b,a,c); //將b 的n-1個盤子在送到c上;
}};
這樣的**直**上去沒有什麼問題,但是執行起來確實錯誤的;
原因如下:
①首先,我們必須承認乙個事實,即上面**段中,最原始的abc三根柱子是在執行過程中可以改變位置的,即原始的a有可能在某次呼叫過程中做b或c的位置,原始的b也有可能在ac的位置;原始的c也有可能在ab的位置;
在清楚一點說,我們把原始的abc,記作[a],[b],[c];而把三個位置的按其作用和功能描述為【source】【helper】【destination】;上面那句話的意思就是在某一次呼叫時[a][b][c]完全都有可能是【source】【helper】【destination】中的任何乙個;
②那麼上面的**問題就凸顯出來了;即原本hanota函式的作用是將本輪次【source】的n盤子完全移動到【destination】,之後本輪次的【source】就沒有盤子了,故而有a.clear();但是實際上,在某一次呼叫時,只是針對該輪次的【source】的盤子完全移動到目標位置,而不是作為【source】的柱子上的所有的盤子都要移動,即該柱子上面不屬於該輪次的盤子並不需要移動;而上面的**就會造成反覆在兩個瓶子裡面來回倒水的情況;故而程式無法停止。
具體說來,比如當[a]的最下面乙個盤子已經移動到[c]時,之後[c]的這個盤子就永遠不會再參與移動;即使[c]在之後的某一輪次中擔當【source】的作用;而在上面的**直接將承擔【source】的作用的[c]的最後乙個盤子也會參與移動,這不就永遠也沒完沒了了嘛。。。這本質是因為指標的濫用而混淆了遞迴函式的某次呼叫和全域性指標位址之間的關係;
在遞迴中要尤其注意全域性指標位址的問題。即要明確遞迴函式中的全域性指標位址是否真的是你要的那個含義。。。
如果比喻成在兩個杯中倒水的問題,上面hanota演算法的本意是先將本輪次【source】中的n-1份水倒到【helper】中,然後再將本輪次的最後乙份水倒入【destination】中,本輪次的n份水倒走後,實際上充當【source】作用的杯子內可能還是有全域性的水的;但是因為指標位址的使用,造成的結果是每次都將【source】中所有全域性的水全部倒走了,導致有限的水在不同的杯中倒來倒去,永遠也無法收斂,因此程式無法停止。
漢諾塔問題(java實現)
漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。假設有x,y,z...
遞迴實現漢諾塔問題
遞迴的思想是將乙個大的複雜的問題分成小的問題來解決,而要求是小的問題與大的問題有相似的解法,並且問題的規模越來越小,並且必須存在遞迴出口。下面就用 完成漢諾塔問題 總結 通過遞迴實現漢諾塔的例子我們可以看出,在涉及大型而複雜的問題時,遞迴會使程式在總體上變得簡單易於理解,而涉及遞迴的呼叫過程時則會比...
漢諾塔問題 遞迴實現
一共就三步 把 n 1 號盤子移動到緩衝區 把1號從起點移到終點 然後把緩衝區的n 1號盤子也移到終點 所以寫成py 就是 def move n from buffer,to ifn 1 print move n from from to to else move n 1,from,to buffe...