汉诺塔
题目:模拟汉诺塔求解过程。
要求:A柱上有n个由小到大的盘子,要求把A柱上的所有盘子移动到C柱上。
规则:1)每次只能移动一个盘子。2)上盘必须小于下盘。3)三根柱随你使用。
【解析】:
一:过程分析
1.首先:只有一个盘子的移动:
步骤:1)1:A–>C 盘子1从A柱移动到C柱。
2.然后:两个
因为最后全部移动要移动到C,所以第一步的1必须放在B。
步骤:1)1:A–>B
2)2:A–>C
3)1:B–>C (建议结合图来看步骤)
3.接下来:三个
第一步,盘子1是先去B还是先去C,才能保证最后所有盘子都在C? 要把所有盘子移动到C盘,到底先移动哪一个?
问题来了。当盘子的个数n增加时,就无法确定第一步的走法。
所以换种思考方式,既然无法确定第一步,那么中间有一步是可以确定的。就是第三个盘子,必须从A移动到C。
试着把盘子1、2看成一个整体,步骤如下:
1)1、2:A–>B
2)3 :A–>C
3)1、2:B–>C
突破点出现:我们发现,第一步和第三步其实是同样的模式,只是柱子的使用不同。舒展开来,步骤如下
联想下去,当4个盘子的时候呢?5个呢?这是一个递归了吧?非常好。
二:代码雏形(方法雏形)
现在可以开始写代码了,总结得出,此递归方法有三个步骤:
1)把//n-1个盘子从A放到B
2)把//第n个盘子从A放到C
3)把//n-1个盘子从B放到C
因为柱子的使用在变法,
我们的方法需要四个变量,盘子数n、来源柱子from、中间柱子aux、目标柱子to。
代码如下:
三:递归出口
递归的出口肯定是n==1。可是代码该怎么写?
1.这里我们也是先假定它只有一个盘子,即n=1.
todo( 1 , A , B , C );
它应该输出 “盘子从A移动到C”。转换成代码:
if( n == 1 ){
System.out.println(“move disk 1 from”+A+"to"+C);
//因为后面的代码不执行了,所以
return;
}
2.n=2
todo( 2 , A , B , C );
步骤如下:
//把n-1 个圆盘,从 f移动到a.(即:把上面的1个盘子,从A移动到B)
1)todo(1 , A, C, B);
//把第n 个圆盘,从 f移动到t.(把第2个盘子,从A移动到C)
2)System.out.println(“move disk "+n+" from”+A+"to"+C);
//把n-1 个圆盘,从 a移动到t.(把上面的1个盘子,从B移动到C)
3)todo(1 , B, A, C);
然后在1)步和第3)步的时候会递归进去,因为n==1,所以分别输出一条语句。
四:方法代码
注意:当n==1时,输出语句后的代码不执行,所以return.
五:测试代码及结果。
结果如下:
六:总结
1)先通过特例找出规律(n=1 ,n=2….)
2)在找规律的过程中出现递归现象:n=3时,分成了三个步骤,其中第一步和第三步,延伸出来的就是递归。
3)写出递归方法里的步骤,完成代码雏形。
4)寻找递归出口。
5)完善递归方法。
6)设计测试方法。
第一次写此类文档,对算法这块也不是很熟,所以希望通过写文档来提高,行文比较干涩,见谅。
补充:此文于寒假书写,今晚回看,居然不晓得自己在说啥 =_= ,神啊见谅。
原文链接:http://comfish.duapp.com/?p=125
要求:A柱上有n个由小到大的盘子,要求把A柱上的所有盘子移动到C柱上。
规则:1)每次只能移动一个盘子。2)上盘必须小于下盘。3)三根柱随你使用。
【解析】:
一:过程分析
1.首先:只有一个盘子的移动:
步骤:1)1:A–>C 盘子1从A柱移动到C柱。
2.然后:两个
因为最后全部移动要移动到C,所以第一步的1必须放在B。
步骤:1)1:A–>B
2)2:A–>C
3)1:B–>C (建议结合图来看步骤)
3.接下来:三个
第一步,盘子1是先去B还是先去C,才能保证最后所有盘子都在C? 要把所有盘子移动到C盘,到底先移动哪一个?
问题来了。当盘子的个数n增加时,就无法确定第一步的走法。
所以换种思考方式,既然无法确定第一步,那么中间有一步是可以确定的。就是第三个盘子,必须从A移动到C。
试着把盘子1、2看成一个整体,步骤如下:
1)1、2:A–>B
2)3 :A–>C
3)1、2:B–>C
突破点出现:我们发现,第一步和第三步其实是同样的模式,只是柱子的使用不同。舒展开来,步骤如下
联想下去,当4个盘子的时候呢?5个呢?这是一个递归了吧?非常好。
二:代码雏形(方法雏形)
现在可以开始写代码了,总结得出,此递归方法有三个步骤:
1)把//n-1个盘子从A放到B
2)把//第n个盘子从A放到C
3)把//n-1个盘子从B放到C
因为柱子的使用在变法,
我们的方法需要四个变量,盘子数n、来源柱子from、中间柱子aux、目标柱子to。
代码如下:
三:递归出口
递归的出口肯定是n==1。可是代码该怎么写?
1.这里我们也是先假定它只有一个盘子,即n=1.
todo( 1 , A , B , C );
它应该输出 “盘子从A移动到C”。转换成代码:
if( n == 1 ){
System.out.println(“move disk 1 from”+A+"to"+C);
//因为后面的代码不执行了,所以
return;
}
2.n=2
todo( 2 , A , B , C );
步骤如下:
//把n-1 个圆盘,从 f移动到a.(即:把上面的1个盘子,从A移动到B)
1)todo(1 , A, C, B);
//把第n 个圆盘,从 f移动到t.(把第2个盘子,从A移动到C)
2)System.out.println(“move disk "+n+" from”+A+"to"+C);
//把n-1 个圆盘,从 a移动到t.(把上面的1个盘子,从B移动到C)
3)todo(1 , B, A, C);
然后在1)步和第3)步的时候会递归进去,因为n==1,所以分别输出一条语句。
四:方法代码
注意:当n==1时,输出语句后的代码不执行,所以return.
五:测试代码及结果。
结果如下:
六:总结
1)先通过特例找出规律(n=1 ,n=2….)
2)在找规律的过程中出现递归现象:n=3时,分成了三个步骤,其中第一步和第三步,延伸出来的就是递归。
3)写出递归方法里的步骤,完成代码雏形。
4)寻找递归出口。
5)完善递归方法。
6)设计测试方法。
第一次写此类文档,对算法这块也不是很熟,所以希望通过写文档来提高,行文比较干涩,见谅。
补充:此文于寒假书写,今晚回看,居然不晓得自己在说啥 =_= ,神啊见谅。
原文链接:http://comfish.duapp.com/?p=125
还没人转发这篇日记