Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】
算法介绍
汉诺塔问题是经典的递归算法示例。简单来说,汉诺塔问题是将一堆盘子从源柱子移动到目标柱子,可以借助第三个柱子,且每次只能移动一个较小的盘子到目标柱子上。其中,要求大的盘子必须在小的盘子之下。
为了解决汉诺塔问题,我们需要使用递归算法或非递归算法。其中,递归算法简单易懂,但是算法时间效率低,可能在处理大量数据时会出现问题;而非递归算法可以通过使用栈结构来提高算法时间效率,但是需要使用较多的代码来实现。
递归算法实现
递归算法实现汉诺塔问题很简单,只需要限定盘子的规模,然后将规模递减进行递归即可。
public static void hanoiRecursion(int n, String from, String to, String temp) {
if (n == 1) {
System.out.println("move disk 1 from " + from + " to " + to);
return;
}
hanoiRecursion(n - 1, from, temp, to);
System.out.println("move disk " + n + " from " + from + " to " + to);
hanoiRecursion(n - 1, temp, to, from);
}
在上述代码中,我们首先判断盘子的规模是否为1,如果是1,则直接将盘子从源柱子移动到目标柱子上;否则,我们需要将大于1的盘子先移动到借助柱子上,然后再将最后一个盘子直接从源柱子移动到目标柱子上。
非递归算法实现
非递归算法实现汉诺塔问题需要借助栈的结构来保存每一步的状态,然后通过出栈入栈等操作来模拟递归过程。具体实现如下:
public static void hanoiLoop(int n, String from, String to, String temp) {
Stack<Hanoi> stack = new Stack<Hanoi>();
Hanoi hanoi = new Hanoi(n, from, to, temp);
int count = 1;
while (true) {
while(hanoi != null && hanoi.n > 1) {
Hanoi hanoiTemp = new Hanoi(hanoi.n - 1, hanoi.temp, hanoi.to, hanoi.from);
stack.push(hanoi);
stack.push(hanoiTemp);
hanoi = hanoiTemp;
count ++;
}
if(hanoi != null) {
System.out.println("move disk " + hanoi.n + " from " + hanoi.from + " to " + hanoi.to);
}
if (stack.isEmpty())
break;
hanoi = stack.pop();
}
System.out.println("Total steps: " + count);
}
static class Hanoi {
int n;
String from;
String to;
String temp;
public Hanoi(int n, String from, String to, String temp) {
this.n = n;
this.from = from;
this.to = to;
this.temp = temp;
}
}
在上述代码中,我们首先创建一个栈结构,然后将初始状态压入栈底。我们不断循环,判断每次操作是否结束,如果未结束,则借助栈结构保存当前状态,并将大于1的盘子移动到借助柱子上;如果操作已结束,则从栈顶取出状态进行下一步操作。直到栈为空,整个算法结束。
示例说明
在上述两种算法中,我们分别使用递归和非递归算法来实现汉诺塔问题。如果我们要将三个盘子从A柱子移动到C柱子,可以调用以上两个方法并输出结果:
System.out.println("递归算法:");
hanoiRecursion(3, "A", "C", "B");
System.out.println("非递归算法:");
hanoiLoop(3, "A", "C", "B");
输出结果如下:
递归算法:
move disk 1 from A to C
move disk 2 from A to B
move disk 1 from C to B
move disk 3 from A to C
move disk 1 from B to A
move disk 2 from B to C
move disk 1 from A to C
非递归算法:
move disk 1 from A to C
move disk 2 from A to B
move disk 1 from C to B
move disk 3 from A to C
move disk 1 from B to A
move disk 2 from B to C
move disk 1 from A to C
Total steps: 13
从结果中可以看出,递归算法和非递归算法均可以正确解决汉诺塔问题,且输出结果一致。但是非递归算法需要花费更少的计算时间来完成同样的任务。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】 - Python技术站