漢諾塔問(wèn)題簡(jiǎn)介
漢諾塔問(wèn)題簡(jiǎn)單來(lái)說(shuō)是根據(jù)一個(gè)印度的傳說(shuō)形成的數(shù)學(xué)問(wèn)題舀透,
有三根桿子A栓票,B,C愕够。A桿上有N個(gè)(N>1)穿孔圓盤走贪,盤的尺寸由下到上依次變小。要求按下列規(guī)則將所有圓盤移至C桿:
每次只能移動(dòng)一個(gè)圓盤惑芭;
大盤不能疊在小盤上面坠狡。
看完上面的簡(jiǎn)介是不是還是感覺(jué)一臉懵逼,好別別著急遂跟,下面我上一張圖逃沿,你在對(duì)著上面的簡(jiǎn)介看一遍你就懂了:
說(shuō)下我們最終要達(dá)到什么目的,還是上一張圖:
邏輯梳理
我們?cè)趺床拍軐上所有的盤子移動(dòng)到C上呢幻锁?
我覺(jué)得這個(gè)問(wèn)題總共分三步:
1.把A上的n-1個(gè)盤通過(guò)C移動(dòng)到B感挥。
2.把A上的最下面的盤移到C。
3.因?yàn)閚-1個(gè)盤全在B上了越败,把B當(dāng)做A重復(fù)以上步驟触幼。
代碼實(shí)現(xiàn)
#pragma mark - 漢諾塔算法
#pragma mark -
/**
漢諾塔算法:將A上的圓盤通過(guò)B這個(gè)柱子移動(dòng)到C上
@param numbers 圓盤的個(gè)數(shù)
@param A 起始圓盤的位置
@param B 轉(zhuǎn)移柱子B
@param C 目標(biāo)柱子
*/
- (void)moveWithNumbers:(NSInteger)numbers A:(NSString *)A B:(NSString *)B C:(NSString *)C {
//當(dāng)只有一個(gè)圓盤的時(shí)候 直接就可以將A上的盤子移動(dòng)到C上
if (numbers == 1) {
NSLog(@"%@-------------->%@",A,C);
}else {
//先將(numbers - 1)個(gè)盤子從A通過(guò)C移動(dòng)到B上
[self moveWithNumbers:(numbers - 1) A:A B:C C:B];
//這里numbers -1 個(gè)盤子都已經(jīng)到B上了 這時(shí)候就可以直接將最大的盤子移動(dòng)到C上了
NSLog(@"%@-------------->%@",A,C);
//此時(shí)B上還存放著(numbers - 1) 個(gè)盤子 所以此時(shí)可以遞歸以B為起點(diǎn) 通過(guò)A來(lái)將最底部的盤子移動(dòng)到C上了
[self moveWithNumbers:numbers - 1 A:B B:A C:C];
}
}
看到這里,你會(huì)發(fā)現(xiàn)究飞,如果去掉注釋代碼就沒(méi)有幾句置谦,是不是感覺(jué)很神奇,當(dāng)然亿傅,如果你沒(méi)有想清楚邏輯的話媒峡,可能要寫出來(lái)也是比較費(fèi)勁的,所以說(shuō)算法注重的是思想嘛葵擎。