汉诺塔问题与递归

什么是汉诺塔?

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

汉诺塔问题的描述

在这里插入图片描述
有A、B、C三个柱子。需要把A柱子上的所有圆盘移动到C柱子上。
注意:在小圆盘上不能放大圆盘;在三根柱子之间一次只能移动一个圆盘。

问题的解决

1.列举

A:起始位置;B:中转位置;C:目标位置
如果只有一个圆盘:A -> C一步走完
在这里插入图片描述两个圆盘:A -> B、A -> C、B -> C在这里插入图片描述
三个圆盘:A -> C、A -> B、C-> B、A -> C、B -> A、B -> C、A -> C
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.问题的分析

1个圆盘:移动1次(21-1)
2个圆盘:移动3次(22-1)
3个圆盘:移动7次(23-1)
………………
64个圆盘:移动264-1次
在这里插入图片描述
如果手动移,问题规模是很大的,非常复杂!!!呢么用递归呢?

3.递归解决思路

通过以上分析,我们发现:如果只有一个圆盘,非常好移;如果有两个圆盘:需要先借助柱子B来完成移动;如果有三个圆盘:需要先借助柱子C把上两个圆盘移动到柱子B上,然后再完成移动……

我们得出猜想假设柱子A上有n个圆盘,需要先把上n-1个圆盘移动到柱子B上。然后把最大的圆盘从A移动到C上。然后再把B上的n-1个圆盘移动到C上。(过程中借助空闲柱子中转)

4.代码实现

依据上面的猜想,我们可以写出代码的实现(Java):

public class test {
    /**
     *
     * @param n 圆盘数量
     * @param pos1 起始位置
     * @param pos2 中转位置(借助)
     * @param pos3 目标位置
     */
    public static void hanio(int n,char pos1,char pos2,char pos3){
        // 只有一个圆盘
        if(n == 1){
            move(pos1,pos3);
            return;
        }
        // 把n-1个圆盘移动到中转位置B
        hanio(n-1,pos1,pos3,pos2);
        // 把剩的一个最大圆盘移动到目标位置C
        move(pos1,pos3);
        // 把柱子B上的n-1个圆盘移动到目标位置C
        hanio(n-1,pos2,pos1,pos3);
    }
    /**
     *
     * @param pos1 起始位置
     * @param pos2 目标位置
     */
    public static void move(char pos1,char pos2){
        System.out.print(pos1+" -> "+pos2+" ");
    }

    public static void main(String[] args) {
        hanio(1,'A','B','C');
        System.out.println();
        hanio(2,'A','B','C');
        System.out.println();
        hanio(3,'A','B','C');
        System.out.println();
    }
}

代码运行结果:
在这里插入图片描述
与我们列举结果相同,猜想成立!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyhgo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值