经典汉诺塔java
正兒八經(jīng)的漢諾塔解題:
漢諾塔移動思想分三步:
1、將上面的第1層~第(n-1)層從初始位置移動到中間位置
2、再將第n層移動到目標(biāo)位置
3、最后將第1層到~第(n-1)層從中間位置移動到目標(biāo)位置(三者順序不能變)
規(guī)則不是說每次只能移動一個漢諾塔么,假如n>2,那么第一步跟第三步都涉及到移動多個漢諾塔,這還怎么移?
第一步和第三步又將問題帶回了 ”將n塊漢諾塔從初始位置移動到目標(biāo)位置“ ,不同的是:
1、移動的初始位置跟目標(biāo)位置改變,
2、移動的數(shù)量n的值變成了n-1。
剛開始學(xué)習(xí)遞歸的時候腦海里想不出來遞歸怎么實(shí)現(xiàn)的,還是要動筆推一下,想是想不完的。下面是調(diào)用一次遞歸函數(shù),程序在調(diào)用函數(shù)跑起來的時候,就像一次請求被一層層處理并且轉(zhuǎn)發(fā),被原路返回響應(yīng)一樣。第一個響應(yīng)數(shù)據(jù)必然是第二個響應(yīng)要用到的數(shù)據(jù)。
簡易版本:?
package Action;public class demo {public static void hanio(int n, String A, String B, String C) {if (n < 1) {System.out.println("漢諾塔的層數(shù)不得小于一");} 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);} }移動:a——》c
移動:a——》b
移動:c——》b
移動:a——》c
移動:b——》a
移動:b——》c
移動:a——》c
總結(jié)
- 上一篇: 【蓝桥杯Java_C组·从零开始卷】第八
- 下一篇: 2021年度总结——做好事不留名·CSD