漢諾塔演算法是很多公司的面試題,經常會讓手寫,這裡總結了一下
1、最最最常見的也是最簡單的漢諾塔演算法,遞迴(這也是學習遞迴的乙個經典演算法題)
/**
* 漢諾塔演算法-遞迴
* * ps:列印移動過程
* @param level 層數
* @param from 起始位置
* @param to 目標位置
* @param other 多出來的那個
* @return 需要的步數
*/public static int move(int level,string from,string to,string other)
return step;
}
2.非遞迴演算法,由遞迴演算法演變而來,將遞迴時儲存的執行緒快照又自己模擬儲存
/**
* 漢諾塔演算法-非遞迴
* * ps:列印移動過程
* @param level 層數
* @param from 起始位置
* @param to 目標位置
* @param other 多出來的那個
* @return 需要的步數
*/public static int move2(int level,string from,string to,string other)
//獲取最新命令
commandsnapshot snapshot = snapshots.remove(snapshots.size()-1);
//若只移動乙個,則執行(漢諾只能乙個乙個移動)
if(snapshot.level == 1)
//移動多個的話,將其拆分成多個移動命令,並儲存起來
else
}return step;
}/**
* 移動命令快照
*/static class commandsnapshot
}
測試:
public static void main(string args)
執行結果:
***********遞迴演算法***********
a ---> c
a ---> b
c ---> b
a ---> c
b ---> a
b ---> c
a ---> c
步數:7
***********非遞迴演算法***********
a ---> c
a ---> b
c ---> b
a ---> c
b ---> a
b ---> c
a ---> c
步數:7
漢諾塔非遞迴演算法
輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一行,按柱1 柱2的格式輸出 輸入樣例 3輸出樣例 a c a b c b a c b a b c 乙個美國學者總結得到 所有的漢諾塔移動可以總結為重複的兩步,我們假設現在最小的圓盤在a柱子上,柱子為a,b,c 第二步 對a...
漢諾塔問題遞迴與非遞迴演算法
漢諾塔問題描述如下 有 a b c 3 根針,n 個圓盤 從 1.n 從上到下,按小到大順序放在 a 處,要求每次移動乙個,並保持從小到大的疊放順序,利用 c,把 n 個盤子移動到 b 處。遞迴演算法比較容易理解 fn hanoi n hanoi move n,a b c fn hanoi move...
漢諾塔 遞迴演算法
個人覺得漢諾塔這個遞迴演算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實網上也有很多 可以直接參考。記得大一開始時就做過漢諾塔的習題,但是那時 寫得很長很長,也是不理解遞迴的結果。現在想起來漢諾塔的演算法就3個步驟 第一,把a上的n 1個盤通過c移動到b。第二,把a上的最下面的盤移到c。第...