漢諾塔的遞迴與非遞迴實現(C 實現)

2021-10-10 02:25:51 字數 2207 閱讀 1945

漢諾塔絕對是遞迴最經典的例子,具體的解釋不多說了,直接上**:

#include

#include

#include

using namespace std;

void

move

(int id,

char x,

char y)

void

hanoi

(int n,

char a,

char b,

char c)

else

}main()

輸出:

1 : a -> c

2 : a -> b

1 : c -> b

3 : a -> c

1 : b -> a

2 : b -> c

1 : a -> c

若n為奇數,則品字形順時針為acb;若n為偶數,則品字形順時針為abc。

然後順時針進行如下操作:

將當前柱子頂部的盤子移動到順時針的下乙個柱子。

將當前柱子和剩餘的另一根柱子比較,將其中的一根柱子的盤子移動到另一根柱子上(很顯然,這種移動方式是固定的)

指標指向順時針的下一根柱子。

遇到某一根柱子的盤子滿了時,停止迴圈。

**寫起來很簡單,我們用三個棧來模擬三根柱子:

#include

#include

#include

#include

using namespace std;

using s=vector<

int>

;int sum;

typedef

struct

stack;

void

initstack

(stack &a, stack &b, stack &c,

int n)

a.name =

'a';

if(n %2==

1)else

}void

move

(stack &a, stack &b)

// 將a中的棧頂元素移入b中

void

moveonetoone

(stack &a, stack &b)

// 演算法的第二步就是對於輸入的兩個棧,將其中乙個棧的棧頂元素移到另乙個棧中

else

if(b.stack.

empty()

)// b如果空的,自然只能把a的元素移到b中

else

if(a.stack.

back()

> b.stack.

back()

)// a的棧頂元素如果大於b的,自然只能把b的元素移到a中

else

// b的棧頂元素如果大於a的,自然只能把a的元素移到b中

}bool isend

(stack &b, stack &c,

int n)

// 若有一根柱子滿了,則迴圈結束

else

}void

hanoi

(int n, stack &a, stack &b, stack &c)

moveonetoone

(a, c);}

else

if(i %3==

1)moveonetoone

(b, a);}

else

moveonetoone

(c, b);}

} cout <<

"共移動了"

<< sum <<

"步"<< endl;

}main()

輸出:

1 : a -> b

2 : a -> c

1 : b -> c

3 : a -> b

1 : c -> a

2 : c -> b

1 : a -> b

4 : a -> c

1 : b -> c

2 : b -> a

1 : c -> a

3 : b -> c

1 : a -> b

2 : a -> c

1 : b -> c

共移動了15步

漢諾塔的遞迴和非遞迴實現

漢諾塔的遞迴和非遞迴實現 借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 n,a,b,c 即將n個盤子從起始柱 標記為 a 通過借助柱 標記為 b 移動到目標柱 標記為 c 並保證每個移動符合漢諾塔問題的要求。輸入為乙個正整數n,即起始柱上的盤數。每個操作 移動 佔一行,按柱1 柱2的格式輸出。3a ...

C 遞迴實現漢諾塔

a為存放盤子的塔,b為目標塔,c為輔助塔 演算法分為三步 一 將a上n 1個盤子全部放到c塔上 二 將a上剩下的乙個盤子放到b塔上 三 將c塔上的盤子全部放到b塔上 注 不需要考慮如何移動n 1個盤子 遞迴過程 首先,將a上n 1個盤子放到c上,然後將a上剩下的乙個盤子放到b上,然後可以看成a為輔助...

C 漢諾塔遞迴實現

程式背景 漢諾塔 tower of hanoi 又稱河內塔,問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之...