1.问题描述有a,b,c三个柱子现有n个圆盘在a柱上且下面的圆盘始终比上面的圆盘大现只能从上面取出圆盘且每次只能取出一个圆盘必须时刻保证下面的圆盘比上面的大2.解决方式递归求解代码package recursionHannuoTa; import java.util.LinkedList; public class Test { // 汉诺塔问题 private static LinkedListInteger a new LinkedList(); private static LinkedListInteger b new LinkedList(); private static LinkedListInteger c new LinkedList(); private static void print(){ System.out.println(); System.out.println(a); System.out.println(b); System.out.println(c); } private static void move(int n, LinkedListInteger src, LinkedListInteger temp, LinkedListInteger des){ if(n 0){ return; // 退出递归 } move(n - 1, src, des, temp); // n-1个圆盘从a柱借助c柱移动到b柱 des.addLast(src.removeLast()); // 将最后一个圆盘移动到c柱 print(); move(n - 1, temp, src, des); // n-1个圆盘从b柱借助a柱移动到c柱 } public static void main(String[] args) { int n 3; for (int i n; i 0 ; i--) { a.addLast(i); } print(); move(3, a, b, c); } }伪代码以三为例 1 move(int 3, src, borrow, des){ 2 move(2, src, des, borrow);{ 3 move(1, src, des, borrow);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 3 print(a, b, c); [3, 2] [] [1] move(0, borrow, src, des); return; } 标记 des.addLast(src.removeLast()); 2 print(a, b, c); [3] [2] [1] 4 move(1, borrow, src, des);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 4 print(a, b, c); [3] [2, 1] [] move(0, borrow, src, des); return; } } 标记 des.addLast(src.removeLast()); 1 print(a, b, c); [] [2, 1] [3] 5 move(2, borrow, src, des);{ 6 move(1, src, des, borrow);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 6 print(a, b, c); [1] [2] [3] move(0, borrow, src, des); return; 标记 des.addLast(src.removeLast()); 5 print(a, b, c); [1] [] [3, 2] 7 move(1, borrow, src, des);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 7 print(a, b, c); [] [] [3, 2, 1] move(0, borrow, src, des); return; } }每一次打印对应的头部move用数字标记了可以看出move(n - 1, src, des, temp);在这行代码递归的时间里他的作用是将a柱中n-1个圆盘摆在b柱上且符合下圆盘大上圆盘小des.addLast(src.removeLast());这行代码的最外层调用也就是第一次执行这个方法时的那行代码一直等到上面的递归结束后执行作用是将最后一个圆盘移动到c柱move(n - 1, temp, src, des);这段递归调用是将b柱的圆盘移动到c柱上且符合下圆盘大上圆盘小最后说一下为什么会符合下圆盘大上圆盘小--从伪代码可以看出每两次 move(n - 1, src, des, temp);后有一次move(n - 1, temp, src, des);而这其中的des.addLast(src.removeLast());所对应的a,b,c柱是不同的temp就是borrow--从我每次打印所标记对应的数字可以看到每三次是一次动作循环前两次是将圆盘分散这个时候的移动是为最后一次做铺垫确保了最后能将一个小圆盘移到仅比他大一位的圆盘上--中间将最后一个圆盘移动到c柱这个操作不参与以上三次循环3.总结伪代码着实给我看了好一会我讲的确实不是很清楚我着实不擅长处理这种变来变去过程又复杂的东西实在不好推敲对于代码的理解我是找到规律然后在大脑中推敲最后再写一遍代码这个属实是给我CPU干烧了要说代码的理解也不复杂就是三步1.将a柱中n-1个圆盘摆在b柱上2.将最后一个圆盘移动到c柱3.将b柱的圆盘移动到c柱上。但这其中传给函数方法的参数不断变化实在不好在大脑推敲所以我不敢说懂了这段代码但也算记了下来以上是我写了伪代码之后得出的一些结论汉诺塔就到次为止吧各位加油。汉诺塔时间复杂度2^n