非遞迴 遞迴 漢諾塔演算法實踐

2021-09-25 07:37:24 字數 1584 閱讀 5556

漢諾塔演算法是很多公司的面試題,經常會讓手寫,這裡總結了一下

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。第...