漢諾塔問題是一個經典的遞歸問題。假設有三個柱子A、B和C,在柱子A上有n個大小不一的圓盤,要求將這些圓盤從柱子A移動到柱子C,且每次只能移動一個圓盤,且在移動過程中不能將較大的圓盤放在較小的圓盤上。可以使用以下C++代碼實現遞歸算法解決漢諾塔問題:
#include <iostream>
using namespace std;
void hanoi(int n, char from, char to, char aux) {
if (n == 1) {
cout << "Move disk 1 from " << from << " to " << to << endl;
return;
}
hanoi(n - 1, from, aux, to);
cout << "Move disk "<< n << " from " << from << " to " << to << endl;
hanoi(n - 1, aux, to, from);
}
int main() {
int n;
cout << "Enter the number of disks: ";
cin >> n;
hanoi(n, 'A', 'C', 'B');
return 0;
}
在這個代碼中,我們定義了一個名為hanoi
的函數,它接受四個參數:圓盤數量n
,起始柱子from
,目標柱子to
和輔助柱子aux
。當只有一個圓盤需要移動時,直接將其從起始柱子移動到目標柱子。否則,我們將前n-1
個圓盤從起始柱子移動到輔助柱子上,然后將第n
個圓盤從起始柱子移動到目標柱子上,最后將前n-1
個圓盤從輔助柱子移動到目標柱子上。
在main
函數中,我們首先輸入圓盤的數量,然后調用hanoi
函數解決問題。