ハノータ再帰アルゴリズムJava実装
1054 ワード
, A,B,C,A n , B ,
,
, H(n)。
問題そのものに戻って、どのように解きますか?
ルール:移動するたびに、同じ柱には現れず、小皿は大皿の上にある.
今仮定します:A柱は3つの皿があって、上から下まで順番に番号をつけます:1、2、3;
3つの皿をすべてB柱に移動します.
その中に必ず存在する状態:
A:3,B:(皿がない)、C:1、2;
全体の問題:必然的に次の3つのプロセスに分解することができます.
1、A柱の2つの皿をC柱に移動する.
2、A柱の1つの皿をB柱に移動する.
3、C柱の2つの皿をB柱に移動する.
A柱の3つの皿をC柱を介してB柱に移動する.
関数で表す:f(3,A,B,C);
1、A柱の2つの皿をC柱に移動する.
f(2,A,C,B);
2、A柱の1つの皿をB柱に移動する.
f(1,A,B,C)->A柱皿をB柱に移動する.
3、C柱の2つの皿をA柱を介してB柱に移動する.
f(2,C,B,A);
関数関係式:f(3,A,B,C)=f(2,A,C,B)+f(1,A,B,C)+f(2,C,B,A);
nに広がる場合:
f(n,A,B,C)=f(n-1,A,C,B)+f(1,A,B,C)+f(n-1,C,B,A);
コード実装:
/**A/B/C ,n A */
public void f(int n,char A,char B,char C) {
if(n == 1) {
System.out.println("move:"+A+"->"+B);
return;
}
f(n-1,A,C,B);
f(1,A,B,C);
f(n-1,C,B,A);
}