目录
思路:递归主要解决类似于一种“套娃”问题:当一个复杂的问题可以通过相同的规律层层递减,并且最终存在一个已知的情况,则可以考虑采用递归。
例如汉诺塔一层层递减下去,当盘子数最终递减到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;
}
运行结果