关于汉诺塔,C++代码,代码效果演算
1.故事介紹
漢諾塔:漢諾塔(又稱河內塔)問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
2.由來
法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的圣廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸于盡。[1]
?
不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,并且始終保持上小下大的順序。這需要多少次移動呢?這里需要遞歸的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不難證明f(n)=2^n-1。n=64時,
?
假如每秒鐘一次,共需多長時間呢?一個平年365天有31536000秒,閏年366天有31622400秒,平均每年31556952秒,計算一下:18446744073709551615秒
?
這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
?
3.漢諾塔的代碼
#include <iostream>
void han(int n, char A, char B, char C)
{
?static int? num = 1;
?//std::cout << "第" << num << "次";
?num++;
?if (n == 1)
?{
??std::cout <<"將盤子"? << n <<" 從 "<< A << "移動到" << C << std::endl;
??return;
?}
?else
?{
??han(n - 1, A, C, B);
??//std::cout << A << "->" << C << std::endl;
??std::cout << "將盤子" << n << " 從 " << A << "移動到" << C << std::endl;
??han(n - 1, B, A, C);
?}
}
//? f(n)=2*f(n-1)+1 //f(n)=2^n-1
//2^64- 1
void main()
{
?int n;
?std::cin >> n;
?std::cout << "n=" << n << std::endl;
?han(n, 'A', 'B', 'C');
?std::cin.get();
?std::cin.get();
}
運行結果如下:
?
面向對象的方式解決問題:
#include <iostream>class han { private:/*盤子個數*/int num;public:void hanoi(int n, char A, char B, char C){static int num = 1;num++;if (n == 1){std::cout << "將盤子" << n << " 從 " << A << "移動到" << C << std::endl;return;}else {hanoi(n - 1, A, C, B);std::cout << "將盤子" << n << " 從 " << A << "移動到" << C << std::endl;hanoi(n - 1, B, A, C);}}/*getter setter*/void setNum(int num){this->num = num;}int getNum(){return this->num;} };int main(int argc,char *argv[]) {int num;std::cout << "請輸入盤子的個數:" << std::endl;std::cin >> num;std::cout << "輸入盤子的個數是:" << num << std::endl;han hanoi;hanoi.setNum(num);hanoi.hanoi(hanoi.getNum(),'A','B','C');std::cin.get();std::cin.get(); }運行效果:
?
4.結果推算步驟演示:
總結
以上是生活随笔為你收集整理的关于汉诺塔,C++代码,代码效果演算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联合创世+黄少杰充电桩会上市吗?您好,上
- 下一篇: C++中的结构体,C管理进程代码,C++