日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一))

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一)) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

把A桿上的金盤全部移到C桿上,并仍保持原有順序疊好。

操作規則:

每次只能移動一個盤子,并且在移動過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置于A、B、C任一桿上。

思路:

圖解:

示例:

當有兩個盤a,b時

示例:

當有三個盤a,b,c時

算法分析(遞歸算法):

實現這個算法可以簡單分為三個步驟:

(1) 把n-1個盤子由A 移到 B;

(2) 把第n個盤子由 A移到 C;

(3) 把n-1個盤子由B 移到 C;

從這里入手,在加上上面數學問題解法的分析,我們不難發現,移到的步數必定為奇數步:

(1)中間的一步是把最大的一個盤子由A移到C上去;

(2)中間一步之上可以看成把A上n-1個盤子通過借助輔助塔(C塔)移到了B上,

(3)中間一步之下可以看成把B上n-1個盤子通過借助輔助塔(A塔)移到了C上

遞歸的代碼實現

```#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個盤子從source移動到goal

}

else

{

hanoi(n - 1, source, goal, temp);

//將n-1個盤子借助goal從source移動到temp

printf("Move %d :from %c to %c\n", n, source, goal);

//將第n個盤子從source移動到goal

hanoi(n - 1, temp, goal, source);

//將n-1個盤子借助source從temp移動到goal

}

}

int main()

{

int n = 0;

printf("請輸入盤子的個數:");

scanf("%d", &n);

hanoi(n, 'A', 'B', 'C');//借助B桿將A中盤移動到C上

return 0;

}```

總結

以上是生活随笔為你收集整理的c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一))的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。