码迷,mamicode.com
首页 > 其他好文 > 详细

2.6 递归与分治策略(汉诺塔问题)

时间:2019-02-28 21:11:03      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:非递归   简洁   过程   []   public   img   class   erro   com   

汉诺塔问题是一个经典问题。

题意理解:有A,B,C三个柱子,将A柱子上的N个盘子(从小到大排列)移到C柱子上,每次只允许移动一个盘子,并且保证每个柱子上的盘子的排列都是从小到大。

技术图片

分析:由题意可知,如果要将A上的盘子移动到C,那么肯定需要借助C。

首先将A上的盘子从上到下依次编号为1-n。

运用整体思想:

  1、假设1到n-1个盘子是一个整体

  2、将1到n-1个盘子构成的整体移动到B

  3、将第n个盘子移动到C

  4、再将第2步移动到B的整体移动到C就可以了。

  重复以上过程,显然这是一个递归的过程。下面给出代码。

 1 public class a2_6 {
 2     static void Hanoi(int n,char A,char B,char C)  //将A上的盘子移动到C
 3     {
 4         if(n>0){
 5             Hanoi(n-1,A,C,B);  //1、将A上1到n-1个盘子移动到B
 6             move(A,C);//2、将A最下面那个第n个盘子移动到C
 7             Hanoi(n-1,B,A,C);  //3、将B上的1到n-1个盘子移动到C
 8         }
 9     }
10 
11     private static void move(char a, char b) {
12         System.out.println(a+"-> "+b);   //第二步,将A上剩余的一个盘移到C;
13     }
14 
15     public static void main(String args[]){
16         Hanoi(4,‘A‘,‘B‘,‘C‘);
17     }
18 }

 

结果大概这么回事:

技术图片

递归写代码很简洁,但是很容易写错,写错基本就StackOverflowError了,然后递归也比较抽象,不是那么容易理解。所以我的原则是可以不用递归尽量不用,后面有时间找找非递归版本的汉诺塔。本人学渣,不足之处,望各位大佬指正,谢谢!

 

2.6 递归与分治策略(汉诺塔问题)

标签:非递归   简洁   过程   []   public   img   class   erro   com   

原文地址:https://www.cnblogs.com/woyaodangxueba/p/10453067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!