哈諾塔問題相信只要學習計算機的人都知道。這是一個古老而又偉大的問題。在這篇文章中舟扎,主要是給出遞歸解決漢諾塔問題的代碼方法览祖。畢竟面試的時候垦页,HR比我們要變態(tài)很多,怎么蹂躪我們怎么玩橡疼。
一素邪、什么是漢諾塔問題
這個問題來源于印度红淡。有三個金剛石塔不狮,第一個從小到大摞著64片黃金圓盤。現(xiàn)在把圓盤按大小順序重新擺放在最后一個塔上在旱。并且規(guī)定摇零,在小圓盤上不能放大圓盤,在三個塔之間一次只能移動一個圓盤桶蝎。
也就是說將 from 上的圓盤全部移動到 to 上驻仅,并且要保證小圓盤始終在大圓盤上。
如何來求解呢登渣?很明顯這道題大家都知道使用遞歸的方式來做噪服。不過如何去考慮遞歸呢?
在這里我想說一下我個人目前關(guān)于遞歸的理解胜茧。遞歸其實就是一個方程式:f(n) = f(n-1) + a;也就是說在設(shè)計遞歸的時候應(yīng)該考慮下面三個方面:
(1)求解f(n)的時候粘优,假設(shè)f(n-1)已經(jīng)求解出來了。我們不要去考慮f(n-1)是如何求解出來的呻顽。
(2)關(guān)鍵點在于遞歸的結(jié)束條件敬飒。
(3)遞歸往往和分治法是分不開的。對于復雜的遞歸芬位,往往將遞歸拆分。然后再合并
整體的遞歸方法流程是這樣的带到。首先我們要寫一個遞歸方法昧碉。
(1)首先判斷遞歸結(jié)束時候的操作
(2)遞歸分解
而本題的漢諾塔就是使用典型的遞歸思想。首先我們求解f(n)
① 將 n-1 個圓盤從 from -> buffer
② 將 1 個圓盤從 from -> to
③ 將 n-1 個圓盤從 buffer -> to
④以上三步都是為了求解f(n)揽惹,最后我們給出遞歸結(jié)束的條件被饿。只有一個圓盤的時候,只需一次移動操作即可搪搏。
二狭握、代碼實現(xiàn)
public class Hanoi {
public static void move(int n, String from, String buffer, String to) {
//第一步:遞歸結(jié)束的條件
if (n == 1) {
System.out.println("from " + from + " to " + to);
return;
}
// n-1 個圓盤從 from -> buffer
move(n - 1, from, to, buffer);
//將 1 個圓盤從 from -> to
move(1, from, buffer, to);
//將 n-1 個圓盤從 buffer -> to
move(n - 1, buffer, from, to);
}
?
public static void main(String[] args) {
Hanoi.move(3, "石柱1", "石柱2", "石柱3");
}
}