汉诺塔
-
抽象出实现的步骤(递归思想:一般看第n项和第n-1项的关系)
1)将n-1块从A以C为临时柱移到B
2)此时就将第n块移动到终点柱C
3)然后把此时处在B的那n-1块借A移动到C
-
移动次数公式
整个过程将n-1块整体移动了两次,加上第n块自身移动了一次
Hanoi(n) = 2Hanoi(n-1)+1
-
过程图解
-
代码实现
public class TestDemo {
public static void move(char pos1, char pos2) {
System.out.print(pos1 + "->" + pos2 + " ");
}
/**
* @param n 盘子个数
* @param pos1 起始位置
* @param pos2 中途位置
* @param pos3 目的地位置
*/
public static void hanoi(int n, char pos1, char pos2, char pos3) {
if (n == 1) {
move(pos1, pos3);
} else {
hanoi(n - 1, pos1, pos2, pos3);
move(pos1, pos3);
hanoi(n - 1, pos2, pos1, pos3);
}
}
/**
* 递归完成汉诺塔问题
*
* @param args
*/
public static void main(String[] args) {
//1 A -> C -- 1 -- 2^1-1
//2 A -> B A -> C B -> C -- 3 -- 2^2-1
//3 A -> C A -> B C -> B A -> C B -> A B -> C A -> C -- 7 --- 2^3-1
//64 2^64-1 电脑 -> 300多年 人 -> 更久
hanoi(1, 'A', 'B', 'C');
System.out.println();
hanoi(2, 'A', 'B', 'C');
System.out.println();
hanoi(3, 'A', 'B', 'C');
System.out.println();
hanoi(64, 'A', 'B', 'C');
}
}
-
大胆猜测(移动64个盘子):假设每次移动一个盘子(2^64-1秒)
1.电脑移:
假设按我电脑处理器1.8来移动,需要移多久:
从数据可以得知需要移300多年,可想而知递归里面重复计算的很多数据对程序的执行时间造成了多大影响。
2.人移
数据简直大的离谱了,移动5千多亿年还是在不用思考,1秒移动一次的基础上所花的时间,所以说,有时候递归确实给我们的程序带来了简化代码的方便,但有时候也会给程序带来负面影响。
本期到此结束!谢谢观看!