汉诺塔的递归java代码怎么写
时间: 2023-02-27 18:43:49 浏览: 12
汉诺塔的递归java代码可以这样写:
public static void hanoi(int n, char from, char to, char temp) {
if (n == 1) {
System.out.println("Move disk 1 from " + from + " to " + to);
} else {
hanoi(n-1, from, temp, to);
System.out.println("Move disk " + n + " from " + from + " to " + to);
hanoi(n-1, temp, to, from);
}
}
相关问题
汉诺塔Java代码递归
### 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]。
汉诺塔用java代码的递归方法编写,并详细解读它
好的,针对您的问题,以下是汉诺塔问题用Java代码递归算法实现及其详细解析:
1. 汉诺塔问题简介
汉诺塔问题,又称河内塔问题,是经典的递归问题,是由一个古老传说而来。大梵天创造世界时造了三根柱子,其中一根柱子自下而上放置n个盘子,从小到大。现在需要将这些盘子从这个柱子搬到另一个柱子,搬的过程中严禁出现大盘子压小盘子的现象。那么问题来了,如何做到呢?
2. 汉诺塔问题递归算法实现
下面是汉诺塔问题的递归算法实现代码,基本思路是将大问题分解成多个同样结构的小问题进行递归求解。在代码中,我们用A、B、C分别代表三个柱子,其中start表示开始的柱子,temp表示临时柱子,end表示目标柱子。
```java
public class HanoiTower {
public static void hanoi(int n, char start, char temp, char end) {
if (n == 1) {
System.out.println(start + "->" + end); // 将编号为1的盘子从start移动到end
} else {
hanoi(n - 1, start, end, temp); // 将n-1个盘子从start移动到temp
System.out.println(start + "->" + end); // 将编号为n的盘子从start移动到end
hanoi(n - 1, temp, start, end); // 将n-1个盘子从temp移动到end
}
}
public static void main(String[] args) {
hanoi(3, 'A', 'B', 'C'); // 测试,移动3个盘子
}
}
```
上述代码中,我们通过调用递归方法hanoi(n-1, start, end, temp)从start将n-1个盘子移动到temp,然后将编号为n的盘子移动到目标柱子end,最后调用递归方法hanoi(n-1, temp, start, end)将n-1个盘子从临时柱子temp移动到目标柱子end。
3. 汉诺塔问题解析
那么,以上代码的具体运行过程是什么呢?假设有3个盘子需要从A柱子移动到C柱子,代码执行过程如下图所示:

首先,我们会调用hanoi(3, 'A', 'B', 'C')方法。由于n > 1,所以会执行hanoi(2, 'A', 'C', 'B')方法,再执行hanoi(1, 'A', 'B', 'C')方法。此时,只有一个盘子需要移动,直接将其从A柱子移动到C柱子即可,输出结果为“A->C”。
接着,hanoi(2, 'A', 'C', 'B')方法会执行else语句,会首先执行hanoi(1, 'A', 'B', 'C')方法,输出结果为“A->B”;然后,执行System.out.println("A->C")语句,输出结果为“A->C”;最后,执行hanoi(1, 'B', 'A', 'C')方法,输出结果为“B->C”。
最终,输出的结果为“A->C A->B C->B A->C B->A B->C A->C”,盘子移动完毕。
至此,汉诺塔问题的递归算法实现及其详细解析就介绍完毕。如果您还有其他问题,可以继续提问,谢谢!
阅读全文
相关推荐











