一、前言

递归算法在执行时需要多次调用自身。实现这种递归调用的关键是为算法建立递归调用工作栈。通常,在一个算法中调用另一算法时,系统需在运行被调用算法之前先完成三件事:

  1. 信息传递:将所有实参指针,返回地址等信息传递给被调用算法;
  2. 栈帧开辟:为被调用算法的局部变量分配存储区;
  3. 控制权下放:将控制权转移到被调用算法的入口。

在从被调用算法返回调用算法时,系统也相应地要完成三件事:

  1. 信息传递:保存被调用算法的计算结果;
  2. 栈帧回退:释放分配给被调用算法的数据区;
  3. 控制权回收:依照被调用算法保存的返回地址将控制转移到调用算法。

当有多个算法构成嵌套调用时,按照后调用先返回的原则进行。不是为了使用栈而使用栈,而是因为必须使用栈才使用栈。

二、汉诺塔问题

处理一切递归问题的解决办法:递归问题,层序分析

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 运行结果

汉诺塔问题---再探讨
图2-1 VS2017运行结果

 

相关文章:

猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-19
相关资源
相似解决方案