java递归问题——汉诺塔

目录

什么是汉诺塔?

  当只有1个圆盘的时候:

  当只有2个圆盘的时候:

  当只有3个圆盘的时候:

汉诺塔代码

思路

代码


什么是汉诺塔?

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

java递归问题——汉诺塔_第1张图片

  当只有1个圆盘的时候:

java递归问题——汉诺塔_第2张图片

A->C 只需要移动1次;

  当只有2个圆盘的时候:

java递归问题——汉诺塔_第3张图片

A->B,A->C,B-C 需要移动3次;

  当只有3个圆盘的时候:

java递归问题——汉诺塔_第4张图片

 A -> C, A -> B ,  C -> B , C -> A , B -> A , C -> B , A -> C 需要7次;

发现规律:

只有1片圆盘的时候,1次,2的1次方减1;

当有2片圆盘的时候,3次,2的2次方减1;

当有3片圆盘的时候,7次,2的3次方减1;

那么当有n片圆盘的时候,移动的总次数sum=2^n -1;

汉诺塔代码

思路

pos1,pos2,pos3不是固定的。

我有3个圆盘时,第一步:我需要将上面两个盘子通过C移动到B,移动几次我不管,反正就是借助C移动到B,那么B就是目标位置,C就是中转位置;

第二步:需要将A移动到C;

第三步:我需要把第二大的圆盘(在B上),通过A移动到C上,那么B就是初始位置,A就是中转位置,C就是目标位置。

以此类推

当我有n个圆盘时,第一步,我需要将n-1个盘通过C移动到B,移动几次我不管。

第二部,将A上的一个盘移动到C;

第三步:需要把第n-1个盘通过A移动到C上,B就是初始位置,A就是中转位置,C就是目标位置。

循环往复,直到n-1等于1时便可终止递归

代码

    //汉诺塔
    //pos1:初始位置
    //pos2:中转位置
    //pos3:目标位置
    //n是有几个片
public static void Hanoi(int n,char pos1,char pos2,char pos3) {
    if(n==1){
        move(pos1,pos3);
        return;
    }
    Hanoi(n-1,pos1,pos3,pos2);
    move(pos1, pos3);
    Hanoi(n-1,pos2,pos1,pos3);
}

    public static void main7(String[] args) {
        Hanoi(3,'A','B','C');

    }

public static void move(char pos1,char pos3){
    System.out.println(pos1+"->"+pos3);
}

你可能感兴趣的:(重新学习编程,java,开发语言)