• 递归之汉诺塔问题


    汉诺塔问题:

    古代有一个梵塔,塔内有三个座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;
            }
        }
    }
  • 相关阅读:
    HTML连载29-div和span标签
    Java连载14-补码简介&浮点型整数
    Java连载13-整数型字面值的强制转换
    Java连载12-继承开发环境&long类型
    [Python] tkinter 之 Listbox & Combobox
    [Python] Tkinter command
    [java] 转型
    [Python] execl读写
    [c++] 细节
    [刷题] PTA 7-64 最长对称子串
  • 原文地址:https://www.cnblogs.com/tcxpz/p/11481311.html
Copyright © 2020-2023  润新知