汉诺塔非递归算法
汉诺塔问介题绍:
在印,度这么有个一老的传说:古在世中心贝拿界勒斯(在度北印部)圣的里,庙块一铜板黄插着上三根宝石。针度教印主神梵的天在创造世的时界候在其中一根针,从上下上地穿到了好大由到的小46金片片,这就是谓的汉诺所。不论塔天白黑夜总,有一个僧在侣照按下面法则的移这动些片金一次,只动移一,片不管哪根针在上,小必片在片大面。上所当的有片金都梵天穿好的从那根上针移到另外概针上一,时世就界在将一声霹中消雳灭梵,塔、庙和众宇都将同生于归。尽
递归算
法
:义定v id oHanoic(arhs c, rcahrdes ,ch ar iav, in tn
)表
示把个n盘从s子cr借上via移动助到des。上
显然有
voi
dHnao(chiar scr,cha rdes, ch ar va, ini tn
){
Hano
isr(c v,ai ,ds, e n- );1
M
ove(rc,sd es, n);// 把n第盘个子直从接rcs移到des
动H
anoi(vai,des,s c,r - n)1;
}
根递归据法,设f(n算)为n个盘子要移动的次。数
么显那然 (n f +) 1 2=f*n) (+1 - [f>n + 1)(+ 1] = 2 *f(n) [ 1+
]f1)(= 1, >- fn( )+ 1= ( +1 1)^ -n f(n> ) =^2n- 。
1
(6f)=42^ 4-1=[***********]155
如假秒每一钟次,需多长共时间?一呢大年约 有3513629 秒,6算表计明移完些这金片需580要多亿0,年比球地命还寿长,事实要上世,、界梵塔、
宇庙众和都已生经灰飞灭。
烟
递归非法算
定:义小从大到的盘子序号别为分,1,2…n…
。可
以用一1个2到^ -n1的2进 序制可以列拟出n个盘子模汉的塔过程中被移动诺的子的盘序号列序。
给定即个一,n我通过们到02n^- 1 序可以判断出任意列一步应该动那个盘移。子
判
方法:第m断移动的步子序盘是号m二进制表示用最低的b位ti为的1位。置
明证 : n 1=,然显成立
。设假n k=成立
。n= k + 1,对应序时1列2到(^k1) + 1,显然这个-序关于2^列左k右对称。
假我设们把要 + 1个k盘子从移A动C。
那么^2可以k对应着Moevk +( ,1 , A)。C1 到 ^2k - 1据根设可以假
应对anoH(Ai,B ,C ,k)至于2。k +^1 2^到k ( +1 -) 把最高位1的1去对应序列掉变成到1^2 k -1,然2显k^ + 1到 2(^ k +1 -)1和 到2^1k -1这两 序列个的中应元素的最对低b位it1的为位相同。因置此2k + 1^到 2^(k 1)+- 可1以对应aHnoiB( ,C,Ak,)。
以对n所 k= +也成1。
立
面下讨第m步论该应移对应的盘动从子到哪?
哪
定顺序义 A为->B->-C>A ,逆序C->B为-A->>。C
性
对n质盘个子汉诺的塔,任意一个盘子kk( 1)以及k+ (如1k果
比如:。n =3
1 A-C
>2
-AB
>
1C-> B
3 A
-C
>
1 B-A>
2 B
->C
1
A >-C
其中
1的轨迹A-C->B>-A>>逆序C,2的轨迹
A-B->C>顺,序3轨迹的-A>逆序
C
证明
:假n设
于对 n =k + 1根据归递算法
anHoi(,ACB,,k+ ) 1=H anoi(A,B, , Ck ) M+ve(A,o ,C k+ ) +1 aHni(B, o,CAk),;
整个
过中盘子k +程1只移动一 A->C次为逆序应着对^k。2
对于意任盘m 子
1
m子的移盘动两部由分组一成分部前是半分Han部io(A, , BC,k 以及)半部后的分Hnao(Bi C,,Ak),组成显然。如果m有在aHno(A, C, Bi,k )迹轨顺序的话则,在Hanmi(o, AB C, ,k以)H及noi(Ba,C A,k),都是序逆反。亦然。之这两部分衔接起来会证就m在明Hano(A,C,Bik)和Hanoi,(A,CB,, +k )1中反序是。
的同
时有anoi塔中最大H盘子永远的是逆且只序动移1,步->CA
这样。话:
的
m= k 1,+在HanoiA(,CB,k,+ 1)中 是逆。序
m k=由于在,HnoaiA,(,BCk)中是,序的逆,所以Hnaio(,CAB,k + ,)1中是序顺。的
m= k - ,由于1在aHni(A,o,B,k - C1)是逆的,序所以aHoni(,C,BAk,是)顺的序所以Hano,iA(,CB,, +k1)是 序逆。
的
依次去下…
结论…证得。
结:总在n汉个诺n, 中 - 2, n n-4…… 逆序是动移,n 1- , - 3nn, -…5…顺是序移动
。
有以上结了,非论归递的序就很程写好了。了写递个和归递非比归程较序
:
#nciule dim
suni ngmeapscae st;
d
ovidHa oinch(ar sr,cc ar hde, cshr vaia, it nn)
{i
(n ==f1)
{
co
tu"
erurn;t
}
H
anio(sr,cv a,i de, s -n1) ;
c
ut o
anoH(iiav,d es,s rc n,- 1);
}
in
t amni)(
{
nitn
;icn>> n ;
cuto
lH
noi(a'A,'C','B', 'n;
)
ocu t
c
ot
c;ahr odrre[]22[5];6
hacrpos[64];
ord
re0[[]A'] '='B ;'
rdeor[]0[B'] =''C ';
or
edr[0]['C' ] 'A';
=rdeo[r][1''] A= C''
orde;[r1][B'] '= '';
Ardore1[]['C' =]'B ;
'
/0是/顺序 是逆1
i序n tndex[i64];
/确/定轨的迹序还顺逆序
是int
i, j ,m;
f
roi( =n ;i > 0; -=i )2
ndei[ix =] ;
1
fo(ir =n - 1 ;i >; i0-= 2 )
nide[x]i 0=;
m
meestp(so, A'',si zefop(os))
;
fro( = i1 i;
{
fro(m =1, = j; i%j2== 0; /j2, m=+ +;)
cuot " -
ops[] =m orerd[idexnm[]][opsm]][
;
re}tunr0
;
}