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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汉诺塔——递归算法

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

一.起源:
  漢諾塔(又稱河內塔)問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

二.抽象為數學問題:
  如下圖所示,從左到右有A、B、C三根柱子,其中A柱子上面有從小疊到大的n個圓盤,現要求將A柱子上的圓盤移到C柱子上去,期間只有一個原則:一次只能移到一個盤子且大盤子不能在小盤子上面,求移動的步驟和移動的次數


三、算法分析

如何實現移動圓盤的操作呢??可以用分治求解的遞歸方法來解決這個問題。設A柱上最初的圓盤總數為n,當n=1的時候只要將編號為1的圓盤從塔座A直接移到塔座C上即可;否則,執行以下的的三步:

1、用C柱作為過渡,將A柱上的(n-1)個盤子移到B柱上來;

2、將A柱上最后一個盤子直接移到C柱上;

3、然后再將B柱上的(n-1)個盤子移到C柱上,用A柱作為過渡;

源代碼:

#include <iostream> using namespace std; int m = 0; void move( char A,int n, char C) {cout <<++m<< "--第"<<n << "塊:" << A << "-->" << C<< endl; } void hanoi(int n, char A, char B, char C) {if (n == 1)move(A, 1, C);else{hanoi(n - 1,A, C, B);move(A, n, C);hanoi(n - 1, B, A, C);} } int main() {int n;cout<<"請輸入漢諾塔的層數:";cin >> n;getchar();hanoi(n ,'a','b','c');getchar();return 0; }

運行結果:

其實這個小型的游戲就是用到了遞歸的算法,而遞歸實際上的操作就是對棧的操作,棧都是先進后出。

擴展:如果想進一步了解棧如何操作的話,可以試著解決八皇后和迷宮等問題。有助于大家了解更多遞歸的操作。

如果大家對C/C++感興趣的話,本小編這里準備了一大堆的學習資料可以免費分享給有需要的朋友們,學習群:前面八七三,中間五二一,后面八零三。連起來就可進群然后免費領取一份學習資料哦!!!!

總結

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

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