递归之汉诺塔问题

汉诺塔问题:

古代有一个梵塔,塔内有三个座A,B,C。A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。

有一个和尚想把这64个盘子从A座移动到C座,但是每次只允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。

在上述移动过程中可以利用B座,要求输出一定的步骤:

求解思路:

可以将问题求解简单分为三个步骤:

(1)把n-1个盘子由A 移到 B;

(2)把第n个盘子由 A移到 C;

(3)把n-1个盘子由B 移到 C;

这样就将原问题分解成了形式形同、规模变小的子问题 

  1个圆盘的次数 2的1次方减1

  2个圆盘的次数 2的2次方减1

       3个圆盘的次数 2的3次方减1

       。  。   。    。   。 

       n个圆盘的次数 2的n次方减1

   故:移动次数为:2^n - 1

递归代码实现:

package com.tcxpz.demo;

import java.util.Scanner;
public class Hanoi {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        hanoi(n,"A","B","C");
    }
    private static void hanoi(int n,String source,String spare,String target){
        if(n==1){
            System.out.println("From "+source+" To "+target);
            return;
        }else{
            //将n-1各盘子从source搬到spare,以target为周转盘
            hanoi(n-1,source,target,spare);
            //将最后一个盘子从source搬到target
            System.out.println("From "+source+" To "+target);
            //再将spare上的n-个盘子搬到target,以source为周转盘
            hanoi(n-1,spare,source,target);
            return;
        }
    }
}
posted @ 2019-09-07 15:57  糖醋小瓶子  阅读(300)  评论(0编辑  收藏  举报