漢羅塔問題:ios
有三個柱子A,B,C,在A中有n個從底部到頂部逐漸減少的盤子,如今要將A柱的盤子移動到C中去,而且在C中也是要從底部開始逐漸減少排列的。算法
這是個典型的經過遞歸來解決的問題,在使用遞歸算法時,this
咱們首先要找到anchor,在此例中,anchor就是:當n = 1時,也就是隻移動一個盤子時,那就是從A柱移動一個盤子到C盤去。若是是n個盤子呢?那咱們首先移動n-1個盤子到B柱去,而後再將A最後一個盤子移到C柱去,最後再將B柱的n-1個盤子移動到C柱去。spa
因此算法以下:code
#include <iostream> #include <iomanip> using namespace std; void move(unsigned n, unsigned &moveNumber, char source, char destination, char spare) { if (n == 1) {//anchor moveNumber++; cout << setw(3) << moveNumber <<". move the top disk from " << source << " to " << destination << endl; } else {//移動n-1個盤子 move(n-1, moveNumber, source, spare, destination);//先移動n-1個盤子到B move(1, moveNumber, source, destination, spare);//在將A最後的一個移動到C move(n-1, moveNumber, spare, destination, source);//再將B的n-1個盤子移動到C } } int main() { const char PEG1 = 'A', PEG2 = 'B', PEG3 = 'C'; unsigned moveNumber = 0; cout << "this programe solves the hanno tower puzzle.\n\n" << endl; cout << "enter the number of disk:" << endl; int numdisks; cin >> numdisks; move(numdisks, moveNumber, PEG1, PEG2, PEG3);//遞歸算法 return 0; }