zoukankan      html  css  js  c++  java
  • 递归之汉诺塔问题

    汉诺塔问题:

    古代有一个梵塔,塔内有三个座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;
            }
        }
    }
  • 相关阅读:
    PHPStrom 转 VSCode 折腾记录
    vscode php 代码提示 自动完成
    Elasticsearch中文分词加拼音
    AutoMapper用法
    删除所有退出状态的容器
    Linux 安装Docker
    千里眼的修练方法--末法时代即将结束
    Visual NMP
    c#通过反射获取类上的自定义特性
    微信小程序学习笔记
  • 原文地址:https://www.cnblogs.com/tcxpz/p/11481311.html
Copyright © 2011-2022 走看看