Java递归基础案例-汉诺塔
漢諾塔問題
/**
* Title: 漢諾塔問題
* Description:古代有一個梵塔,塔內有三個座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上。
* 有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子,并且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。在移動過程中可以利用B座。要求輸入層數,運算后輸出每步是如何移動的。
*/
1,當只有一個的時候
從A 移動盤子1 號到C
2,當只有2個的時候
?
?
從A 移動盤子1 號到B
從A 移動盤子2 號到C
從B 移動盤子1 號到C
3,當只有3個的時候
?
從A 移動盤子1 號到C
從A 移動盤子2 號到B
從C 移動盤子1 號到B
從A 移動盤子3 號到C
從B 移動盤子1 號到A
從B 移動盤子2 號到C
從A 移動盤子1 號到C
?4,當只有4個的時候
?從A 移動盤子1 號到B
從A 移動盤子2 號到C
從B 移動盤子1 號到C
從A 移動盤子3 號到B
從C 移動盤子1 號到A
從C 移動盤子2 號到B
從A 移動盤子1 號到B
從A 移動盤子4 號到C
從B 移動盤子1 號到C
從B 移動盤子2 號到A
從C 移動盤子1 號到A
從B 移動盤子3 號到C
從A 移動盤子1 號到B
從A 移動盤子2 號到C
從B 移動盤子1 號到C
按照規律編寫代碼:
package Action;public class test {public static void main(String[] args) {int nDisks = 4;//盤子別直接寫64,計算量太大moveDish(nDisks, 'A', 'B', 'C'); }/*** @description 在程序中,我們把最上面的盤子稱為第一個盤子,把最下面的盤子稱為第N個盤子* @param level:盤子的個數* @param from 盤子的初始地址* @param inter 轉移盤子時用于中轉* @param to 盤子的目的地址*/public static void moveDish(int level, char from, char inter, char to) {if (level == 1) { // 遞歸終止條件System.out.println("從" + from + " 移動盤子" + level + " 號到" + to);return;} else {// 遞歸調用:將level-1個盤子從from移到inter(不是一次性移動,每次只能移動一個盤子,其中to用于周轉)moveDish(level - 1, from, to, inter); // 遞歸調用,縮小問題的規模// 將第level個盤子從A座移到C座System.out.println("從" + from + " 移動盤子" + level + " 號到" + to);// 遞歸調用:將level-1個盤子從inter移到to,from 用于周轉moveDish(level - 1, inter, from, to); // 遞歸調用,縮小問題的規模}} }可以看到,里面的操作過程有一些類似全排列的操作,所以【全排列】是這個漢諾塔的基礎哦。
希望能給大家帶來一定的幫助。
總結
以上是生活随笔為你收集整理的Java递归基础案例-汉诺塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断一个字符串是否全部不相同
- 下一篇: Java程序运行纳秒级差值计算