在一根柱子上從下往上按照大小順序摞著64片黃金圓盤,求把圓盤從下面開始按大小順序重新擺放在另一根柱子上需要移動多少次。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
解答:
我們可以拿n=3的時候舉例子:
易知f(1)=1,f(2)=3,f(3)=7……;
當n=2時候(1,2,3分別表示小中大三塊盤子):
當n=3時候:
n=3的前三步就是重複n=2時候,把小的兩塊移動到另一個一個柱子。
然後就是將3移動到另一塊柱子上,在繼續重複n=2把小的兩塊移動到另一個(指存在3的一個)柱子上。
擴充到n,即f(n)=2*f(n-1)+1
這就變成了遞迴問題!!
只計算次數,簡單的c++程式如下:
#include <iostream>using namespace std;int main(){ int num,cont=0,a=1; cout<<"請輸入需要移動的盤子數目:"<<endl; cin>>num; int val(int); //函式宣告 if(num==0){ cout<<"輸入的數字必須大於0!"<<endl; return -1; } else cout<<"需要"<<val(num)<<"次"<<endl; return 0;} int val(int n){ int c; if(n==1) c=1; else c=2*val(n-1)+1; }
顯示步驟:
每個步驟都是將n-1個盤子從A移到B,把最下面個移到C,然後把N-2個從B移到A,第N-1個移到C,如此繼續下去。
#include<iostream>using namespace std;int main(){ void hanoi(int n,char one,char two,char three); int m; cout<<"輸入盤子數:"; cin>>m;; hanoi(m,'A','B','C');}void hanoi(int n,char one,char two,char three){ void move(char x,char y); if (n == 1) { move(one,three); } else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); }}void move(char x, char y){ cout<<x<<"-->"<<y<<endl;}