从第一个学期开始就有遇到汉诺塔的问题,但只是为了完成作业所以上网随便抄了一些代码而已,并没有真正理解。
今天又一次遇到了这个问题…想着还是解决一下比较好。
参考了这篇文章:参考文章
(作者未注明,若侵 删)
递归问题
以前一直认为递归问题很令人头疼,无从下手。但其实今天仔细研究过后发现递归的关键是关注即时问题以及单位问题(自己乱取的名字)。能递归解决的问题基本上能分解成为多个模式相同的单位问题。
例如在Hanoi中将n-1个圆盘放到中间柱上。
代码
这次是用java写的还是贴一下吧。
public static void main(String[] args) {
Lab1_4_Hanoi h = new Lab1_4_Hanoi();
//move函数的 功能 即是将4个从A经由B移动到C,不用再追究细节。
h.move(4, 'A', 'B', 'C');
}
//函数move定义
public void move(int n, char a, char b, char c){
if(n == 1){
System.out.println("把"+n+"从"+a+"移动到"+c);
}
else{
//此处调用,目的是将n-1个从A经由C移动到B(中间柱),无需追究细节
move(n-1, a, c, b);
System.out.println("把"+n+"从"+a+"移动到"+c);
//再将n-1个从中间柱上挪到目标柱上
move(n-1, b, a, c);
}
}
}
我以前一直纠结于为何move(n-1, b, a, c);
这种在递归函数中本身被调用的用途一直令我纠结。但其实只需明白其功能,抓住功能即抓住了要点,这样再追踪细节便容易得多了。