zoukankan      html  css  js  c++  java
  • 汉诺塔递归实现

    1. 问题描述

    相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、 由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在 移动过程中三根杆上都始 终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

    2. 问题分析

    因为无法直接从题目中获得思路,所以采用数学归纳法进行推导

    让n为当前层数上的圆盘编号,当n=1的时候:
      圆盘1直接从AC
    n=2的时候:
      圆盘1需要从AB
      圆盘2需要从AC
      圆盘1需要从BC
     其中B作为中间柱被使用过一次
    n=n的时候(将n-1看为一个整体):
       A. A上的n-1个圆盘需要从A移动到B(借助于C)
       B. 圆盘n需要从AC
       C. B上的n-1个圆盘需要从BC (借助于A

      当步骤为A的时候:
        1. 将A上的n-2个圆盘移到C上。
        2. 将A上的第n-1个圆盘移到B
        3. 将C上的n-2个圆盘移到B

      当步骤为C的时候:
        1. 将B上的n-2个圆盘移到A
        2. 将B上的第n-1个盘子移到C
        3. 将A上的n-2个圆盘移到C

    所以从上面可以分析出来,当n>=2的时候可以分为三个步骤:

    1. 将A上的n-1个圆盘借助于C移动到B上;(A为初始位置,C为中间位置,B为目的位置)
    2. 将A上的第n个圆盘移动到C上;
    3. 将B上的n-1个圆盘借助于B移动到C上;(B为初始位置,A为中间位置,C为目的位置)

    3. 编码

    可以创建方法:

        /**
         * @param layer  层数
         * @param init   初始位置
         * @param middle 中间位置
         * @param target 目标位置
         * @return void
         */
        private static void solve(int layer, String init, String middle, String target) {
            if (1 == layer) {
                System.out.printf("%d从%s移动到%s;
    ", layer, init, target);
            } else {
                solve(layer - 1, init, target, middle);      //1.
                System.out.printf("%d从%s移动到%s;
    ", layer, init, target);     //2.
                solve(layer - 1, middle, init, target);      //3.
            }
        }
    

    方法说明

    1. 这里inti是初始位置,target是中间位置,middle是目标位置;目的是将(1~n-1)放到中间位置

    2. 将n转移到目标位置,按规矩n转移没有借助中间位置,所以默认他很自觉,自己到目的位置,直接System.out.printf("%d从%s移动到%s; ", layer, init, target);

    3. 将(1~n-1)从中间位置转移到目标位置,原理同说明1

  • 相关阅读:
    android中正确保存view的状态
    使用AudioTrack播放PCM音频数据(android)
    【录音】Android录音--AudioRecord、MediaRecorder
    (原创)初识cordova(一)
    忽略git中不需要进行版本管理的文件
    GitHub 小试
    通过View.post()获取View的宽高
    org.json.JSONObject的getString和optString使用注意事项
    android---EditText的多行输入框
    【转】我赌5毛你没见过这样的SpannableString
  • 原文地址:https://www.cnblogs.com/huizhipeng/p/12050540.html
Copyright © 2011-2022 走看看