汉诺塔(路径的实现)

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

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

基本思想:

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  }

 

转载于:https://www.cnblogs.com/didudi/p/6500874.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值