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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

(递归2)汉诺塔

發布時間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (递归2)汉诺塔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

約19世紀末,在歐州的商店中出售一種智力玩具,在一塊銅板上有三根桿,最左邊的桿上自上而下、由小到大順序串著由64個圓盤構成的塔。目的是將最左邊桿上的盤全部移到中間的桿上,條件是一次只能移動一個盤,且不允許大盤放在小盤的上面。
這是一個著名的問題,幾乎所有的教材上都有這個問題。由于條件是一次只能移動一個盤,且不允許大盤放在小盤上面,所以64個盤的移動次數是:18,446,744,073,709,551,615
這是一個天文數字,若每一微秒可能計算(并不輸出)一次移動,那么也需要幾乎一百萬年。我們僅能找出問題的解決方法并解決較小N值時的漢諾塔,但很難用計算機解決64層的漢諾塔。

假定圓盤從小到大編號為1, 2, …

輸入
輸入為一個整數后面跟三個單字符字符串。
整數為盤子的數目,后三個字符表示三個桿子的編號。
輸出
輸出每一步移動盤子的記錄。一次移動一行。
每次移動的記錄為例如 a->3->b 的形式,即把編號為3的盤子從a桿移至b桿。
樣例輸入
2 a b c
樣例輸出
a->1->c
a->2->b
c->1->b

分析

用遞歸解決問題,一個關鍵點是要有遞歸結束的條件
當只有一個盤子的時候,直接就是A->1->B,這也是遞歸結束的條件
定義一個函數Hanoi(n,a,b,c)//將n個盤子從a經過c移動到b

當有N個盤子的時候,我們知道需要這樣移動,(n-1,a,b,c)//將a上的n-1個盤子經過b移到c。然后將a上的標號為n的盤子移動到b盤子上

此時c盤子上有n-1個盤子,需要把這n-1個盤子上面的n-1-1個盤子移到a上,然后把標簽為n-1的盤子移到b盤子上

之后c盤子里面 沒東西了,只有a盤子里了,又重復回去了

#include <iostream> using namespace std;void Hanoi(int n,char a,char b,char c){if(1==n) cout<<a<<"->"<<1<<"->"<<b<<endl;else{Hanoi(n-1,a,c,b);cout<<a<<"->"<<n<<"->"<<b<<endl;Hanoi(n-1,c,b,a);}} int main(){int n;char a,b,c;cin>>n>>a>>b>>c;Hanoi(n,a,b,c);return 0; }

總結

以上是生活随笔為你收集整理的(递归2)汉诺塔的全部內容,希望文章能夠幫你解決所遇到的問題。

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