1、n阶Hanoi塔问题
- void hanoi(int n,char x,char y,char z)
- //将塔座X上按直径由小到大且自上到下编号为1至n的n个圆盘按规则搬到塔座z上,y可用作辅助塔座
- //搬动操作move(x,n,z)可定义为:printf("%i.Move disk %i from %c to %c\n",++c,n,x,z);
- //c是初始值为0的全局变量,对搬动计数
- {
- if(n=1)
- move(x,1,z); //将编号为1的圆盘从x移到z
- else{
- hanoi(n-1,x,z,y); //将x上n-1个圆盘搬到y上,z作辅助塔
- move(x,n,z); //将第n个盘子从x移动到z上
- hanoi(n-1,y,x,z); //将y上n-1个盘子搬到z上,x作辅助塔
- }
- }
二、栈与递归
一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数
若在函数A中调用了函数B,则称函数A为调用函数,称函数B为被调用函数。
当在一个函数的运行期间调用另一个函数时
在运行被调用函数之前,系统需先完成3件事 | 从被调用函数返回调用函数之前,系统也需先完成3件事 |
1、将所有的实在参数、返回地址等信息传递给被调用函数保存 | 1、保存被调函数的计算结果 |
2、为被调用函数的局部变量分配存储区 | 2、释放被调函数的数据区 |
3、将控制转移到被调函数的入口 | 3、依照被调函数保存的返回地址将控制转移到调用函数 |
当有多个函数构成嵌套调用时,按照“后调用先返回”的原则
【一个递归函数的运行过程类似于多个函数的嵌套调用,只是调用函数和被调用函数时同一个函数】
每一层递归所需信息构成一个“工作记录”,其中包括所有的实在参数、所有的局部变量以及上一层的返回地址。每进入一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归,就从栈顶弹出一个工作记录,则当前执行层的工作记录必是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。