問題描述:
假設有3
個分別命名為x,
y,z的塔座,在塔座
x上插有
n個直徑大小各不相同、依小到大編號為1,
2,……n個圓盤。現要求將
x軸上的
n個圓盤移至塔座
z上並仍按同樣順序疊排,圓盤移動時必須遵守下列規則:(1
)每次只能移動乙個圓盤;(2
)圓盤可以插在x,
y和z中的任一塔座上;(3
)任何時刻都不能將乙個較大的圓盤壓在較小的圓盤之上。求n
個盤至少需移動的次數,並輸出移動的步驟。
演算法描述:
已知:a上有n
個盤子。 如果
n=1,則將圓盤從
a直接移動到c。
如果n=2,則: 1.
將a上的n-1(
等於1)
個圓盤移到b上;
2.再將a
上的乙個圓盤移到c上;
3.最後將b
上的n-1(
等於1)
個圓盤移到c上。
如果n=3,則:
a. 將a
上的n-1(等於2
,令其為
n`)個圓盤移到
b(借助於
c),步驟如下:
(1)將a
上的n`-1(
等於1)
個圓盤移到c上。
(2)將a
上的乙個圓盤移到b。
(3)將c
上的n`-1(
等於1)
個圓盤移到b。
b. 將a
上的乙個圓盤移到c。
c. 將b
上的n-1(等於2
,令其為
n`)個圓盤移到
c(借助
a),步驟如下:
(1)將b
上的n`-1(
等於1)
個圓盤移到a。
(2)將b
上的乙個盤子移到c。
(3)將a
上的n`-1(
等於1)
個圓盤移到c。
到此,完成了三個圓盤的移動過程。
從上面分析可以看出,當
n大於等於
2時,移動的過程可分解為三個步驟:
第一步把a
上的n-1
個圓盤移到b上;
第二步把a
上的乙個圓盤移到c上;
第三步把b
上的n-1
個圓盤移到
c上;其中第一步和第三步是類同的。 當
n=3時,第一步和第三步又分解為類同的三步,即把
n`-1
個圓盤從乙個針移到另乙個針上,這裡的
n`=n-1
。顯然這是乙個遞迴過程
實現**(
c語言):
#include
int cnt=0;
int main()
void hanoi(int n,char one,char two,char three)
else
}void move(char x,char y)
執行結果為:
蛙跳台階問題解決演算法
題目 乙隻青蛙可以一次跳上一級台階,也可以一次跳上二級,求該青蛙跳上乙個n級台階總共有多少種跳法1 解題思路 我們把n級台階的跳法看成是n的函式,記為f n 當n 2時,第一次調的時候就有兩種不同的選擇,一是第一次跳一級,則此時的跳法數目等於後面剩下的n 1級台階的跳法數目,即為f n 1 另一種選...
java 蛙跳台階問題解決演算法
題目 乙隻青蛙可以一次跳上一級台階,也可以一次跳上二級,求該青蛙跳上乙個n級台階總共有多少種跳法解題思路 我們把n級台階的跳法看成是n的函式,記為f n 當n 2時,第一次調的時候就有兩種不同的選擇,一是第一次跳一級,則此時的跳法數目等於後面剩下的n 1級台階的跳法數目,即為f n 1 另一種選擇是...
遞迴問題解決漢諾塔 C
includevoid hanoii char a,char b,char c,int n void main void hanoii char a,char b,char c,int n else 首先讓我們來看一看 c語言的實現方法 我們可以把所有情況都看做一種情況 即看作兩層漢諾塔。首先我們來...