汉诺塔问题与递归

导读:本篇文章讲解 汉诺塔问题与递归,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

什么是汉诺塔?

汉诺塔(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();
    }
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/118620.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!