汉诺塔java代码

本文通过实例讲解了汉诺塔问题及其解决方法,并提供了详细的递归算法实现过程,包括具体的Java代码示例。
汉诺塔应该都玩过,就是这个[img]http://image.baidu.com/i?ct=503316480&z=&tn=baiduimagedetail&word=%BA%BA%C5%B5%CB%FE%D3%CE%CF%B7&in=32144&cl=2&lm=-1&pn=3&rn=1&di=47426513640&ln=656&fr=&fmq=&ic=&s=&se=&sme=0&tab=&width=&height=&face=&is=&istype=#pn3&-1[/img],[color=red]几个木头套来套去的,小在大的上面,[/color]将他从1个棍子上弄到另外个上,小的时候玩的时候是有点挑战性,不过现在就差点了,昨天老师刚讲了他的最小移动算法,代码如下“
public static int num(int i) {
if(i == 1)
return 1;
return 1+num(i-1)*2;
}

所以就想能不能试着写下代码,试着表示如何移动,例如”1将第一根棍上编码为1的木头移动到第三根棍上“等等,还写了什么Wood,Stack等类,为他们也写了什么put,delete,isLegal方法,[color=red]最后写了大概半个小时,放弃了,我发现只能看规律,写一个方法[/color],故上网看看其他人代码,结合自己的想法完成了代码

public class Test {

public static void main(String[] args) {
print("1","3","2",3);
}
/*
* index 现在的罗汉塔的位置 初始位置是1,之后有改变
* to 罗汉塔要移动到的位置
* replace 罗汉塔备用的那根
* i 最多有多少根木头
*/
public static void print(String index,String to, String replace, int i) {
//i == 1时不解释 你懂的
if(i == 1) {
System.out.println(index + "------>" + to);
return;
}
/*
* 当i不为1时,可以考虑将所有i-1个木头放在replace上
* 所以index不变,to的位置变为replace,replace变为to
*/
print(index,replace,to,i-1);
/*
* 将第i个木头放在to上
*/
System.out.println(index + "------>" + to);
/*
*现在所有i-1个木头都在replace上,要让它去to那
*所以index变为 replace,to不变,repalce变为index
*/
print(replace,to,index,i-1);
}


}

这画图有点难所以做了个zip,[color=red]里面就一个PPT,一个word[/color][size=small][/size][size=medium][/size][size=large][/size]我怕可能只装word没ppt,所以弄了俩。内容写的很简单,应该能看懂。
### Java 实现汉诺塔递归算法 以下是使用Java编写的汉诺塔递归解决方案: ```java import java.util.Scanner; public class HanoiTower { /// 移动函数用于打印每次移动的具体操作 private static void move(char fromPeg, char toPeg) { System.out.println("Move disk from " + fromPeg + " to " + toPeg); } /// 主要的递归方法来解决问题 public static void hanoi(int n, char source, char auxiliary, char target) { if (n == 1) { move(source, target); // 当只有一个圆盘时直接从源柱移到目标柱 return; } // 将前n-1个圆盘通过辅助柱移至中间柱 hanoi(n - 1, source, target, auxiliary); // 移动第n个即最底下的那个大圆盘到目标柱上 move(source, target); // 接着再把剩下的n-1个小圆盘由辅助柱经由原起点柱最终全部转移到目的柱上去 hanoi(n - 1, auxiliary, source, target); } public static void main(String[] args){ System.out.print("请输入盘子总数n:"); Scanner scanner = new Scanner(System.in); int numberOfDisks = scanner.nextInt(); hanoi(numberOfDisks, 'A', 'B', 'C'); } } ``` 此程序首先定义了一个`move()`函数用来显示每一步的操作过程。接着实现了核心逻辑——`hanoi()`函数,它接收四个参数:待搬运的圆盘数目、起始柱、辅助柱以及目的地柱。 当只剩下一个圆盘的时候(`if (n == 1)`), 只需简单地将其从源柱移动到目标柱即可完成任务。对于多于一个圆盘的情况,则采用分治策略: - 首先利用辅助柱作为中介将顶部\(n−1\)个较小尺寸的圆盘搬离当前底部最大者; - 然后单独处理这个最大的圆盘,把它放到指定的目标位置; - 最后再重复上述动作直到所有的圆盘都被正确安置到位[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值