[递归]汉诺塔例子&java代码

文章介绍了汉诺塔游戏的规则和解决策略,通过递归方法解决n个圆盘的移动问题。当n=1时直接移动,n>1时则分为将n-1个圆盘移动到中间柱,移动最大圆盘至目标柱,再将n-1个圆盘从中间柱移动到目标柱。给出了Java代码示例来演示这一过程。
摘要由CSDN通过智能技术生成

汉诺塔:

又称河内塔,是一个源于印度古老传说的益智游戏。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

思路:

这里我们命名3根柱子分别为A,B,C,圆盘在A柱上,移动到C柱。

先看几种简单的情况:

(首先这里ABC可以称为起始柱、临时柱、终点柱。)

n=1时:直接移动到C。

n=2时,移动过程如下:

 

可表示为: A->B        A->C        B->C

n=3时,移动过程如下:

 可表示为:A->C        A->B        C->B        A->C        B->A        B->C        A->C

其中需要注意的一点是:在n=3时,要从A移动3个圆盘到C上,途中会经历2个圆盘在B上的时候。如下图:

 这个时候其实就是n=2时候的操作,只是现在临时柱变成了A,同理,如果是n=5,途中会经历的情况:

 把最大圆盘移动到C,这里也就是n=4时候的操作。

所以总结思路:n个圆盘的时候,第一个目标是把n-1个盘子移动到临时柱上,然后第二目标把1最大圆盘移动到终点柱上,最后再把n-1移动到终点柱上完成最终目标。

如果n=5。便是前4移到临时柱上,在把最大圆盘1移动到终点柱上,再把前4移到终点柱上,便可实现最终目标。

那么是怎么把前4分别移到临时柱和终点柱的呢,那么便是把前3移到临时柱上,在把前最大圆盘1移动到终点柱上,再把前3移到终点柱上……直到分别把前1移到临时柱上,在把前最大圆盘1移动到终点柱上,再把前1移到终点柱上(到1可以直接移动过去)。

如下:

1.父问题和子问题是一样的事,且不断简单。2.有一个化简为非递归状态的出口。所以可以用递归。

代码如下: 

public class HanNuoTa {
    public static void main(String[] args) {
        while (true){
            System.out.println("玩几层汉诺塔");
            int n=new  Scanner(System.in).nextInt();
            f(n);
        }
    }

    private static void f(int n) {
        f(n,"A","B","C");//n代表圆盘个数 A,B,C分别代表3个柱子
    }

    private static void f(int n, String from, String mid, String  to) {//from起始柱 mid临时柱 to终点柱
        if(n==1){//结束条件,到1触底结束
            System.out.println(from+"->"+to);
            return;
        }
        f(n-1,from,to,mid);//n-1个 A->B
        f(1,from,mid,to);//最大一个 A->C
        f(n-1,mid,from,to);//n-1个 B->C
    }

}

代码执行过程: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值