一、前言
递归算法在执行时需要多次调用自身。实现这种递归调用的关键是为算法建立递归调用工作栈。通常,在一个算法中调用另一算法时,系统需在运行被调用算法之前先完成三件事:
- 信息传递:将所有实参指针,返回地址等信息传递给被调用算法;
- 栈帧开辟:为被调用算法的局部变量分配存储区;
- 控制权下放:将控制权转移到被调用算法的入口。
在从被调用算法返回调用算法时,系统也相应地要完成三件事:
- 信息传递:保存被调用算法的计算结果;
- 栈帧回退:释放分配给被调用算法的数据区;
- 控制权回收:依照被调用算法保存的返回地址将控制转移到调用算法。
当有多个算法构成嵌套调用时,按照后调用先返回的原则进行。不是为了使用栈而使用栈,而是因为必须使用栈才使用栈。
二、汉诺塔问题
处理一切递归问题的解决办法:递归问题,层序分析。
2.1 实现
#include<iostream>
using namespace std;
/*
将n个盘子按照汉诺塔的规则由src移动到des
n-盘子个数;
src-起点;
des-终点;
tmp-中转站;
*/
template<typename T>
void hanoi(int n, T src, T des, T tmp)
{
if (n > 0) //有盘子可以移动
{
hanoi(n - 1, src, tmp, des); //将n-1个较小盘子从src位置移动到tmp位置
cout << src << "->" << des << endl; //从src位置拿起一个盘子放到des位置
hanoi(n - 1, tmp, des, src); //将n-1个较小盘子从tmp位置移动到des位置
}
}
int main()
{
hanoi(3, 'A', 'B', 'C');
return 0;
}
2.2 运行结果