汉诺塔问题(函数的递归)图文解释

汉诺塔问题(函数的递归)

1.汉诺塔:

     法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。(如图,看得一脸懵逼,不慌,大佬带你飞,往下看)。

2.汉诺塔的编程解决算法:递归实现

     要理解什么是递归,在第五章里面已经总结了函数的递归:函数的递归就是指函数自身调用自身。
     汉诺塔动画流程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
整个汉诺塔在移动的过程中主要注意的是想要最大的移到最后就必须让请几个在出去在中间,保证最后面是空的,才可以移最大的一个。例如,四个盘子,想要挪第四个最大的到最后,就必须让前三个在中间。

四个盘子的详细过程:

前4个 x->z
    前3个 x->y
        前2个 x->z
            前1个 x->y
            第2个 x->z
            前1个 y->z
    第3个 x->y
        前2个 z->y
            前1个 z->x
            第2个 z->y
            前1个 x->y
    第4个 x->z
    前3个 y->z
        前2个 y->x
            前1个 y->z
            第2个 y->x
            前1个 z->x
    第3个 y->z
        前2个 x->z
            前1个 x->y
            第2个 x->z
            前1个 y->z

3.代码段实现:

public class Sample {
    /*
    汉诺塔问题
    前4个 x->z
        前3个 x->y
            前2个 x->z
                前1个 x->y
                第2个 x->z
                前1个 y->z
            第3个 x->y
            前2个 z->y
                前1个 z->x
                第2个 z->y
                前1个 x->y
        第4个 x->z
        前3个 y->z
            前2个 y->x
                前1个 y->z
                第2个 y->x
                前1个 z->x
            第3个 y->z
            前2个 x->z
                前1个 x->y
                第2个 x->z
                前1个 y->z
    */
    public static void main(String[] args) {
        String x = "x";
        String y = "y";
        String z = "z";
        hano(4,x,y,z); 
    }
    public static void hano(int level, String begin, String mid, String end) {
        if (level == 1) {
            System.out.println(begin + "->" + end);
        } else {
        	//前面level - 1
            hano(level - 1, begin,end,mid);
            System.out.println(begin + "->" + end);
            hano(level - 1, mid,begin,end);
        }
    }
}

注:
hano(level - 1, begin,end,mid);
//保证请几个最终要落在中间(中途借助end位置移动)
System.out.println(begin + “->” + end);
//把最大的一个直接挪到最后
hano(level - 1, mid,begin,end);
//归位,保证中间的最后移到最后(中途借助begin位置移动)
运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值