ハノイのタワー(図示)を解決するための再帰的方法
問題の説明は、
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層を求める場合。(表示するにはここをクリックしてください)
個人的な学習のレッスンは、任意の質問を学んだ、私を修正してください。