摘要:漢諾塔問題描述有三個圓柱,其中上從上至下放置了從小到大個圓盤,一次只能移動一個圓盤,且大的圓盤不能放在小圓盤之上,要求打印出從將圓盤移到的方案。
漢諾塔問題描述:有A, B, C三個圓柱,其中A上從上至下放置了從小到大n個圓盤,一次只能移動一個圓盤,且大的圓盤不能放在小圓盤之上,要求打印出從A將圓盤移到C的方案。
當n = 1時, A->C
當n = 2時, A->B, A->C, B->C
當n = 3時, [A->C, A->B, C->B,] A->C,[B->A, B->C, A->C]
當n = 4時, A->B, A->C, B->C, A->B, C->A, C->B, A->B,
A->C, B->C, B->A, C->A, B->C, A->B, A->C, B->C
當n = 5時, A->C, A->B, C->B, A->C, B->A, B->C, A->C,
A->B, C->B, C->A, B->A, C->B, A->C, A->B, C->B A->C, B->A, B->C, A->C, B->A, C->B, C->A, B->A, B->C, A->C, A->B, C->B, A->C, B->A, B->C, A->C
當n > 2時,第n項,[A->B],A->C,[B->C]
第n-1項,A->B [A->C],A->B,[C->B] B->C [B->A],B->C,[A->C] 第n-1-1項, 第n-1項,A->C(此處的C應該是B),A->C,和第n-1-1項,A->B(此處的B應是C),B->C …… 如此重復,可以用遞歸求得結果
由此,不難看出,計算n個圓盤,所需要的次數為f(n) = 2*f(n-1)+1
代碼:
const move=(a,c)=>{ console.info(`${a}->${c}`) } const hanoi = (n,a,b,c)=>{ if(n === 1){ move(a,c) }else{ //[A->B] hanoi(n-1,a,c,b); move(a,c); //[B->C] hanoi(n-1,b,a,c); } }
參考:從fibonacci和漢諾塔看分治法
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88905.html
摘要:應用分治法是一種很重要的算法。字面上的解釋是分而治之,就是把一個復雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題直到最后子問題可以簡單的直接求解,原問題的解即子問題的解的合并。 ...
摘要:漢諾塔問題有三根柱子,源桿,暫存桿,目的桿上有層盤子,由小到大向下排列,現需要將桿的盤子移到桿中要求大的盤在下面,小的盤在上面一次只能移動一個盤子個人思路先分析問題,用數學的歸納法當只有一個盤時,直接移動當有兩個盤時,先將小的移到暫存桿,再 漢諾塔問題: 有三根柱子,源桿A,暫存桿temp,目的桿C A上有n層盤子,由小到大向下排列,現需要將A桿的盤子移到C桿中 ...
閱讀 891·2021-11-23 09:51
閱讀 1102·2021-11-15 17:57
閱讀 1673·2021-09-22 15:24
閱讀 819·2021-09-07 09:59
閱讀 2232·2019-08-29 15:10
閱讀 1856·2019-08-29 12:47
閱讀 759·2019-08-29 12:30
閱讀 3376·2019-08-26 13:51