java大作业汉诺塔,Java算法_汉诺塔

//汉诺塔算法

public static void main(String[] args) {

int nDisks = 3;

doTower(nDisks, 'A', 'B', 'C');

//调用doTower方法,用static可以直接调用,不需要用构造器构造后调用

}

public static void doTower(int topN,char from,char inter,char to){

//汉诺塔有个很明确的特性,奇数:顶端一个移动到C位置,偶数:顶端的要先移动到B位置

//入参: 3 ,a ,b ,c

if(topN == 1)//topN==1才走这个逻辑

System.out.println("..Disk 1 from "+from+" to "+to);

else{

//topN-1的思想:要留一个,最后一个直接从A移到C的位置

// from, to, inter 排序思想:要移动的数量特性:奇数(顶上移动到c) 偶数(顶上移动到b)

//topN==1 的话不走这个逻辑,直接移动到c,topN==2:topN-1 得到是1, b和c换个位置,调用本身方法。走if逻辑,虽然参数名称还是to,实际值已经是b了

//采用了递归:出入栈的方式,一层一层的进入,一层一层的出来

//入参第一次: topN==3,a,b,c

//else.doTower[1] = 2 ,a,c,b 入第一层,对应变量:from,inter,to

// doTower[1]: topN==2,a,c,b 入参 ,跳过if, 调用 doTower[1] 后:1,a,b,c 入第二层,对应变量:from,inter,to

//走if,把最上面的一个移动到c [大,中] [] [小]

//退出第二层,返回第一层,入参的值为:2,a,c,b

//else中第一层 第二行: a中拿一个移到c (System的语句)2,a,c,b 对应的入参变量是:from,inter,to [大] [中] [小]

//else中第一层.第三行:程序走到else.doTower[2]== 2,a,c,b,调用doTower后的参数顺序为:1 c,a,b 对应入参方法变量:from,inter,to 进入doTower[2],第二层

//程序走到else.doTower[1]==2 c,a,b ,再次调用doTower,参数为:1 c,a,b,对应入参变量:from,inter,to ,调用if:c 中拿个移到b[大][中,小][]

//if走完后退出第二次进入的第二层,返回第一层,执行完else.doTower[2]后,退出doTower[1]的第一层,返回原始层

//原始层,main方法中doTower()的else.doTower[1]走完,开始走ease的第二行代码,第一层参数:3,a,b,c入参变量是:from,inter,to

//原始层,else.system, from+" to "+to [大][中,小][] > [][中,小][大] main方法中doTower()的else第二行代码走完

//原始层,doTower().else.doTower[2]:参数:3,a,b,c,对应变量:from,inter,to 调用自身方法后参数:2,b,a,c,进入doTower[2]第一层

//doTower[2]第一层,跳过if,进入else,调用else.doTower[1]: 2,b,a,c > 1,b,c,a 调用自身方法, 入参变量名from,inter,to

//doTower[2]第一层.else.doTower[1]第二层.if from+" to "+to from,inter,to(1,b,c,a ) b拿一个到a [][中,小][大] > [小][中][大]

//退出if第二层,返回doTower[2]第一层,走else第二行代码from "+from+" to "+to :第一层参数:(from,inter,to )2,b,a,c,

//doTower[2]第一层,走else第二行代码:from+" to "+to b拿一个到c [小][中][大]>[小][][中,大]

//doTower[2]第一层,走else第三行代码,参数(from,inter,to )2,b,a,c, 调用 doTower[2], 入参后:1,a,b,c,进入第二层

//第二层调用if from+" to "+to, 参数(from,inter,to ) 1,a,b,c a拿一个到c [小][][中,大]>[][][小,中,大],执行完退出第二层

//返回第一层.else第三行代码,下面没有可执行代码,返回原始层,原始层,doTower().else.doTower[2]没有可进行代码,退出程序

doTower(topN-1, from, to, inter);

System.out.println("Disk "+topN+" from "+from+" to "+to);

doTower(topN-1, inter, from, to);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值