目次
アイデア :再帰は、主に一種の「モックドール」に似た問題を解決します。同じ法則で複雑な問題を減らすことができ、最終的に既知の状況がある場合、再帰を考慮することができます。
たとえば、ハノイの塔は層ごとに減少しています。プレートの数が最終的に1に減少した場合、中間位置を通過せずに、プレートを初期位置から目標位置に移動するだけで済みます。
1.ハノイの塔
重要なのは、再帰の終わりには明確な結果があり、無限の「モックドール」ではないということです。。。
#include <iostream>
using namespace std;
int m; //计数
void move(char src, char goal)
{
cout << src << " -> " << goal << endl;
m += 1;
}
void hanio(int n, char src='A', char middle='B', char goal='C')
{
if (n == 1) //递归的终点
move(src, goal);
else{
hanio(n - 1, src, goal, middle); //以 前n-1盘子为整体移到中间,
move(src, goal); //将剩余的一个移到目标位置,
hanio(n - 1, middle, src, goal); //再将n-1盘子为整体移到目标位置即可。
}
}
int main()
{
int n;
m = 0;
cout << "输入盘子个数:" << endl;
cin >> n;
cout << "结果如下:" << endl;
hanio(n);
cout << "所需步骤个数为:" << m << endl;
return 0;
}
運用結果