ハノイのタワー(図示)を解決するための再帰的方法

ハノイのタワー(図示)を解決するための再帰的方法

問題の説明は、
3本のロッド左右(左、中、右)、1、ボトムアップ(から)のオーダーNUM金プレートを降順に配置された有します。ゲームの目的:黄金のプレート、ロッド(から)すべての(に)別のバーに移動し、まだ折り畳ま元の順序を維持します。
操作規則は:プレートのみを移動させることができ、そして3本のバーは、常に小さなキャップに、移動中市場未満に維持されます。
示されるように上部左ポールNUMディスクは右極に移動します。
上から1、2、3として下に、...、 NUM-1、NUM プレートここに画像を挿入説明
ここに画像を挿入説明
例えば
左としての、半ば、NUM 3(中央左から移動する、すなわち、3枚の板)として
メソッド移動:
。移動を1からMIDに左
、左から右へ2を移動
。移動1 MIDから右へ
。移動3 MIDの左から
左に右から1に移動
する権利MIDから移動2
。MID左から1移動
再帰法
(底再帰)再帰ヘッド。これらnumが直接の標的を去ったとき、ポールの上に移動して戻ります。
再帰体(出発ロッド)そこから及び(終了バー)に、他方の極が他、NUM-1が他のディスクFROMから移動され配置されて、次に移動する最大NUMディスクの残りの1つ、最後に、ディスクがNUM-1へ...に移動して
、出力
モバイル板NUMの数を入力して、ロッドを起動し、ターゲットへのロッドから、
出力移動方法及び携帯電話番号を。
参照コード

import java.util.Scanner;
public class HanNuoTa {
 public static void main(String[] args) {
  Scanner cs = new Scanner(System.in);
  System.out.print("盘子个数: "); 
  int num =cs.nextInt();           //输入盘子个数
  System.out.print("起始位置: ");
  String from = cs.next();         //输入起始杆,from,mid 或 right
  System.out.print("终止位置: ");
  String to = cs.next();           //输入目标杆,from,mid 或 right
  System.out.println(Pro(num,"left","mid","right",from,to));
  
 }
  static int Pro(int num, String left, String mid, String right, String from, String to) {
  if(num<1) return 0;
  else return process(num,left,mid,right,from,to);
  }
  static int process(int num, String left, String mid, String right, String from, String to) {
   if(num==1) {
    System.out.println("move "+ num +" from "+ from +" to "+ to);
    return 1;  //返回移动次数
   }
   //下面为递归体,先要找到除from和to的另一个杆子
   //我分为两步去找,如果from和to有一个是mid杆子,则另一个杆子不是left就是right
   //否则,另一个杆子就是mid
   //然后开始移动
   if(from.equals(mid)||to.equals(mid)) {
    String another = (from.equals(left)||to.equals(left))?right:left;
    //找到另一个杆子another
    int part1 = process(num-1,left,mid,right,from,another);
    //将num-1个圆盘从from移到another
    int part2 = 1;
    System.out.println("move "+ num +" from "+ from +" to "+ mid);
    //将剩余一个最大的圆盘num移到to
    int part3 = process(num-1,left,mid,right,another,to);
    //最后将num-1个圆盘从another移到to
    return part1+part2+part3;  //返回移动次数
   }
   else { 
    //此时另一个圆盘就是mid
    int part1 = process(num-1,left,mid,right,from,mid);
    int part2 = 1;
    System.out.println("move "+ num +" from "+ from +" to "+ to);
    int part3 = process(num-1,left,mid,right,mid,to);
    return part1+part2+part3;
   }
  }
}

ファイル名を指定して実行を
ここに画像を挿入説明
考えて
、今のゲームのルールを変更:今制限が右端に直接左端の列から移動することはできません、右端遠くから左へ直接移動しませんが、真ん中を通過する必要があります。記録動作及び手順の最も最適総数が移動したときタワーN層を求める場合。表示するにはここをクリックしてください

個人的な学習のレッスンは、任意の質問を学んだ、私を修正してください。

リリース元の4件の記事 ウォンの賞賛3 ビュー158

おすすめ

転載: blog.csdn.net/weixin_44272266/article/details/105086437