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