遞迴思想之如何理解漢諾塔問題

2022-09-03 18:00:12 字數 957 閱讀 2828

​ 有a,b,c三個柱子,將a柱子上的n個盤子(從大到小排列)移到c柱子上,每次只允許移動乙個盤子,並且保證每個柱子上的盤子的排列都是從大到小。

#include using namespace std;

void haoi(int n,char a,char b,char c)

{ if(n==1)

{cout<"<"<​ 關於這個問題我看了許多文章,其中有一篇文章講了乙個變薄的道理,很形象說明了遞迴的本質,也就是我們**看的是最上面的,然後遞迴下去,最後回溯上來,類似乙個v字型的結構。為什麼我會說變薄呢,其實我們可以這麼理解,

假設當前n=3,我們把上面兩塊當成乙個整體,那麼對應n=2的操作是:

1.a->b

2.a->c

3.b->c

其實直接是這麼寫的

haoi(n-1,a,c,b); // cout<< a->b <"為什麼呢,其實可以理解為遞迴過程就是為了cout<< a->b 《也就是說最後問題會簡化為cout<< a->b 《此時就是

最開始a:n-1

最終簡化後就是:

a:2-1(從下到上有兩個盤子) b:空 c:n-3(從下到上有n-2個盤子)(這個結果就是遞迴的結果)

每次呼叫遞迴就是一次簡化過程(變薄過程,你完全可以忽略c放的是什麼盤子,因為它是最大的)

最終簡化的前一步簡化就是:

a:32 b:空 c:n-4 這裡2代表的是21

a:43 b:空 c:n-5 這裡3代表的是321

a:n-(n-1) b:空 c:空 這裡n-1代表是(n-1)-1

其實這個遞迴相比那種階乘遞迴的難理解是因為這裡是兩個遞迴再交叉,導致人腦不能直接回溯,也就是多個子問題->父問題,而不是乙個子問題->父問題。

但是按照簡化的步驟來看,要做的操作永遠是

1.a->b

2.a->c

3.b->c

所以**就不難寫出來了。

河內之塔 漢諾塔問題 遞迴

河內之塔 towersofhanoi 是法國人m.claus lucas 於1883年從泰國帶至法國的,河內為越戰時 北越的首都,即現在的胡志明市 1883年法國數學家edouardlucas曾提及這個故事,據說創世紀時benares有一座波羅教塔,是由三支鑽石棒 pag 所支撐,開始時神在第一根棒...

漢諾塔問題(遞迴)

題目描述 對於傳統的漢諾塔遊戲我們做乙個拓展,我們有從大到小放置的n個圓盤,開始時所有圓盤都放在左邊的柱子上,按照漢諾塔遊戲的要求我們要把所有的圓盤都移到右邊的柱子上,請實現乙個函式列印最優移動軌跡。給定乙個int n,表示有n個圓盤。請返回乙個string陣列,其中的元素依次為每次移動的描述。描述...

漢諾塔問題(遞迴)

問題 漢諾塔問題 解法 遞迴求解 思路 先把n 1從a移動b 在把第n個從a移到c 使用遞迴使得 變得簡單 複雜度 2的n次方 1 includeint step 1 void hanoi int level,char a,char b,char c 1 當盤子數大於1時,先把n 1個從a借助c移動...