汉诺塔问题

来源:互联网 发布:香港中老年人奶粉知乎 编辑:程序博客网 时间:2024/06/05 22:56
提示:汉诺塔问题是程序设计中的经典递归问题 ,使用递归解决,统计递归调用的次数即可。

编写代码前我们先来阅读一个关于汉诺塔的小故事!

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
该传说说大梵天创造世界的时候做了三根金刚石柱子A,B,C,在一根柱子上从下往上按照大小顺序摞着20片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.僧侣们预言,当所有的黄金圆盘都从梵天穿好的那根柱子上移到另外一根柱子上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

现在要求激将A柱上的盘子全部移到C柱上面,问需要移动多少次。

先说说解决思路

假设(前)“将N-1个盘子从A针移动到B针”所需次数为F(n-1),总移动次数为F(n)
中间的盘子B作为中转站一般地工作
当A把最后一个盘子放到C后
再将B上的N-1个盘子移动到C上,那么还是需要F(n-1)次
得到我们结论公式F(n) = 2 F(n-1) + 1,F(1) = 1

代码如下:

    public class Test {      public static void main(String[] args) {        int n=hnt(20);//定义汉诺塔一共20个盘子        System.out.println(n);//输出次数      }      public static int hnt(int x) {        if(x==1)            return 1;        return hnt(x-1)*2+1;//x-1是把临界条件下a最大的盘子放到c的最下面                            //*2是因为要把临界情况前后都相当于(n-1)!汉诺塔问题                            //+1是因为临界条件上的一次                           }    }

我们可以看下图片来理解一下,方便理顺思路
这里写图片描述

0 0
原创粉丝点击