經典算法題:漢諾塔
題目描述:
相傳在古印度聖廟中,有一種被稱為漢諾塔(Hanoi)的游戲。該游戲是在一塊銅板裝置上,有三根桿(編號A、B、C),在A桿自下而上、由大到小按順序放置64個金盤(如下圖)。游戲的目標:把A桿上的金盤全部移到C桿上,並仍保持原有順序疊好。操作規則:每次只能移動一個盤子,並且在移動過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置於A、B、C任一桿上。

騷里騷氣分析:
解決辦法之一是用手抓起來直接挪過去,簡單粗暴(粗魯)。區區幾個小方塊而已,還難不倒我。
事實真的是這樣嘛,往往很多時候,現實中看似簡單的背后蘊含許多細節,而忽略細節的人面臨的將是失敗。
我們都不畏懼失敗,因為我們終將成功!但是不必要的挫折卻會使你一蹶不振。你不是不夠聰明,只是還缺少一雙發現細節的眼睛~。要知道這個游戲可是被放到四大文明古國—古印度的神廟里。就像古埃及金字塔那些神秘的數字一樣,令科學家們都感到不可思議。我們不能小瞧了他,更不可掉以輕心,就讓我們鄭重其事端正態度。所以請你務必穿一身黑色西服,擦亮你的愛馬仕皮鞋,把頭發梳成大人的模樣進入戰斗狀態。天黑的路雖沒有盡頭,可是你別忘了么,那一年我們一起變成了光!請記住!一定要全力以赴,不給自己退路!Maybe下一刻的你將光芒萬丈!
正兒八經解題:
漢諾塔移動思想分三步:
1、將上面的第1層~第(n-1)層從初始位置移動到中間位置
2、再將第n層移動到目標位置
3、最后將第1層到~第(n-1)層從中間位置移動到目標位置(三者順序不能變)
有疑惑???規則不是說每次只能移動一個漢諾塔么,假如n>2,那么第一步跟第三步都涉及到移動多個漢諾塔,這還怎么移?
第一步和第三步又將問題帶回了 ”將n塊漢諾塔從初始位置移動到目標位置“ ,不同的是:
1、移動的初始位置跟目標位置改變,
2、移動的數量n的值變成了n-1。
*/
剛開始學習遞歸的時候腦海里想不出來遞歸怎么實現的,還是要動筆推一下,想是想不完的。下面是調用一次遞歸函數,程序在調用函數跑起來的時候,就像一次請求被一層層處理並且轉發,被原路返回響應一樣。第一個響應數據必然是第二個響應要用到的數據。
代碼
import java.util.Scanner;
public class hanoi {
public static void hanio(int n,String A,String B,String C){
if(n<1){
System.out.println("漢諾塔的層數不得小於一");
}
else if(n==1){ //遞歸出口
System.out.println("移動:"+A+"——》"+C);
return;
}
else{ //核心移動三步
hanio(n-1,A,C,B);
System.out.println("移動:"+A+"——》"+C);
hanio(n-1,B,A,C);
}
}
public static void main(String args[]){
String a = "a";
String b = "b";
String c = "c";
hanio(3,a,b,c);
}
}
截圖:
心情_2020011314:36,保衛處兼職。這個冬天有點想看雪。