hanoi塔问题

汉诺塔问题是一个很经典的一个递归算法问题。

说在古代印度的贝拿勒斯圣庙里,安放了一块黄铜板,板上插了三根宝石柱(不妨设A、B、C柱),在A宝石柱上,自上而下按由小到大的顺序串有64个金盘。要求将A柱子上的64个金盘按照下面的规则移到C柱上。

规则:

①一次只能移一个盘子;

②盘子只能在三个柱子上存放;

③任何时候大盘不能放在小盘上面。

任务:输入正整数n(A柱上的盘子数),输出移动到C柱上的移动过程。

这里写图片描述

解答

这题的答案相信大家都知道是要移动2n12n−1次 那么这是怎么算出来的呢?

算法分析

我们用 A 、B、C 来代表三个柱子上的移动。

1.当n =1 时  我们直接    A->B
2.当n =2 时 
        A->B
        A->C
        B->C
3.当n=3时
        A->C
        A->B
        C->B
        A->C
        B->A
        B->C
        A->C

分析了前3个我们就可以找出一定的规律了。

这里写图片描述
我们可以吧递归的过程看成栈。先进后出的思想理解上面的图

当我们有n个圆盘时
递归程序如下:

①首先把他的n-1个圆盘 由第一个柱子移动到第二个柱子。以第三跟柱子为中转轴
②输出第n个盘(即最大的那个盘),把第n个盘放到第三柱子中
③把第n-1个盘由第二个柱子移动到第三个柱子中去。以第一个为中转轴

这就是递归的思路
java代码如下

public static void main(String[] args) {
        int n = sc.nextInt();
        hanoi(n,'A','B','C');//'A','B','C'代表3个柱子
    }
    private static void hanoi(int n, char c, char d, char e) {
        if(n==1)
        {
            System.out.println(c+"->"+e);
            return;
        }
        hanoi(n-1,c,e,d);//递归第一步 将前n-1个由第一个柱子移动到第二根柱子
        System.out.println(c+"->"+e);//第二步 将最大的圆盘移动到第三个柱子上去
        hanoi(n-1,d,c,e);//第三步  将前n-1个由第二根柱子移动到第3根柱子;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值