首页 > 其他 > 详细

汉诺塔(路径的实现)

时间:2017-03-04 12:35:08      阅读:201      评论:0      收藏:0      [点我收藏+]

这个问题最重要的就是要有递归的思想.

作为初学者的我对这个问题做了一些思考,最后我靠着自己的关于对递归的理解独立完成了这件事,希望你们收获自己独立思考后完成后的成就感.

基本思想:

1.不管最左边有多少层,就把它看成两层,最底下一层和除去最底下一层的所有其他层.(我把它们分别记作base0,^base0)

(画的丑了点,还请见谅,哈哈)

技术分享

2.移动:

①^base0 from A to C

②base0 from A to B

③^base0 from C to A

3.好了,下面就是考虑^base0怎么移动了

道理是一样的,下面以拆分①的步骤为例

step1:^base1 from A to B

step2:base1 from A to C

step3:^base1 from B to C 

读者有没有发现2中步骤与3中步骤十分类似(没找出来再仔细看看)

这时我们就可以把这三个步骤抽象为方法(函数)

下面放出最关键的递归函数

        void f1(int n,char st,char ed){//st表示start,移动起始点;ed表示end,移动的结束点
        if(n==0) return;
        char ne=next(st,ed);
        f1(n-1,st,ne);
        System.out.println(st+"to"+ed);
        f1(n-1,ne,ed);
    }

下面放出完整的源码

 1 import java.util.Scanner;
 2  public class Hanoi2 {
 3       public static char next(char x,char y){
 4   if(x==‘A‘||y==‘A‘){
 5   if(x==‘B‘||y==‘B‘){
 6           return ‘C‘;
 7       }
 8       else return ‘B‘;
 9   }
10  else return ‘A‘;
11      }
12      public static void f(int n,char st,char ed){
13          if(n==0) return;
14         char ne=next(st,ed);
15         f(n-1,st,ne);
16          System.out.println(st+"to"+ed);
17         f(n-1,ne,ed);
18     }
19      public static void main(String[] args) {
20          Scanner sc=new Scanner(System.in);
21          int n=sc.nextInt();
22          sc.close();
23         f(n,‘A‘,‘B‘);
24      }
25  
26  }

 

汉诺塔(路径的实现)

原文:http://www.cnblogs.com/didudi/p/6500874.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!