汉诺塔问题(JAVA)与递归的理解
直接上代码
package com.xiaokai.test;
/**
* @Description 汉诺塔的递归实现测试
* @Author xiaokai
* @date 2022/3/15 5:17
*/
public class HanoiTest {
//静态全局变量,统计递归的次数
public static int count;
/**
* @Des main()方法入口
* @Author xiaokai
* @Date 2022/3/15 20:03
* @Param [args]
* @Return void
*/
public static void main(String[] args) {
int topN = 3;
HanoiTest hanoiTest = new HanoiTest();
hanoiTest.doTowers(topN, 'A', 'B', 'C');
System.out.println(count);
}
/**
* @Des 汉诺塔的解法递归调用
* @Author xiaokai
* @Date 2022/3/15 19:52
* @Param [topN, from, inter, to] topN:有几个碟子需要移动; from:起始位置 inter:中间位置 to:目标位置
* @Return void 没有返回
*/
public void doTowers(int topN, char from, char inter, char to) {
count++;
//递归结束的控制条件,即只有一个碟子的时候,直接A-->C
if (topN == 1){
System.out.println("Disk 1 从 "+from+" 移动到 "+to);
}else {
//topN-1递归,将除了最底下的 Disk(topN) 之外的(topN)个碟子看做一个整体,
//首先将topN-1个移动到中间位置,需要交换to和inter的位置:A-->B,使用递归
doTowers(topN-1,from,to,inter);
//然后将Disk(topN)碟子从起始位置移动到目标位置:A-->C,只移动一个碟子,不用递归,直接输出
System.out.println("Disk "+topN+" 从 "+from +" 移动到 "+to);
//下一步将之前作为整体的(topN-1)个碟子从中间位置移动到目标位置上:B-->C,使用递归,需要交换起始位置和中间位置
doTowers(topN-1,inter,from,to);
}
}
}