c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一))
把A桿上的金盤全部移到C桿上,并仍保持原有順序疊好。
操作規(guī)則:
每次只能移動(dòng)一個(gè)盤子,并且在移動(dòng)過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置于A、B、C任一桿上。
思路:
圖解:
示例:
當(dāng)有兩個(gè)盤a,b時(shí)
示例:
當(dāng)有三個(gè)盤a,b,c時(shí)
算法分析(遞歸算法):
實(shí)現(xiàn)這個(gè)算法可以簡單分為三個(gè)步驟:
(1) 把n-1個(gè)盤子由A 移到 B;
(2) 把第n個(gè)盤子由 A移到 C;
(3) 把n-1個(gè)盤子由B 移到 C;
從這里入手,在加上上面數(shù)學(xué)問題解法的分析,我們不難發(fā)現(xiàn),移到的步數(shù)必定為奇數(shù)步:
(1)中間的一步是把最大的一個(gè)盤子由A移到C上去;
(2)中間一步之上可以看成把A上n-1個(gè)盤子通過借助輔助塔(C塔)移到了B上,
(3)中間一步之下可以看成把B上n-1個(gè)盤子通過借助輔助塔(A塔)移到了C上
遞歸的代碼實(shí)現(xiàn)
```#include
void hanoi(int n, char source, char goal, char temp)
{
if (n == 1)
{
printf("Move %d :from %c to %c\n", n, source, goal); //將第n個(gè)盤子從source移動(dòng)到goal
}
else
{
hanoi(n - 1, source, goal, temp);
//將n-1個(gè)盤子借助goal從source移動(dòng)到temp
printf("Move %d :from %c to %c\n", n, source, goal);
//將第n個(gè)盤子從source移動(dòng)到goal
hanoi(n - 1, temp, goal, source);
//將n-1個(gè)盤子借助source從temp移動(dòng)到goal
}
}
int main()
{
int n = 0;
printf("請輸入盤子的個(gè)數(shù):");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');//借助B桿將A中盤移動(dòng)到C上
return 0;
}```
總結(jié)
以上是生活随笔為你收集整理的c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一))的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: winformlabel自动换行
 - 下一篇: 微信安装包11年膨胀575倍,UP主:“