递归 是一种程序的形式,在函数体内调用自身
定义
定义:在函数体中引用自身,则称之为递归函数。
直接递归 间接递归
一般形式:
void Pname( 参数表 ){
if ( 条件 ) //递归出口
简单操作;
else { 简单操作;
Pname (实参表); 简单操作;
[Pname (实参表); 简单操作;]
} //可能有多次的调用
}
内部实现原理
一般函数的内部实现
(1) 从程序的执行过程讨论
在执行调用时,计算机内部至少执行如下操作:
- 保存返回地址,即将返回地址入栈。
- 为被调子程序准备数据:计算实在参数的值,并赋给对应形参。
- 转入子程序执行
在执行返回操作时,计算机内部至少执行如下操作:
- 从栈顶取出返回地址,并且出栈
- 按返回地址返回
(2)关于局部变量的实现的讨论
在执行调用时,内部操作如下:
- 返回地址入栈,同时在栈顶为被调过程的局部变量和形参开辟存储空间
- 为被调子程序准备数据:计算实在参数的值,并赋给对应的形参(在栈顶)
- 转入子程序执行
(3) 关于返回值的实现的讨论
返回操作的内部实现秀给为如下几项:
- 如果函数需要求值,将其值保存到回传变量中
- 从栈顶取出返回地址,并退栈
- 按照返回地址返回
- 在返回后自动执行如下操作:如果函数需要求职,从回传变量中取出所保存的值并且传送到相应的变量或者位置上
递归调用的内部实现原理
可以将递归调用理解为调用与自己有相同的代码和同名的局部变量的子程序。
在执行调用时, 计算机内部执行如下操作:
(a)开辟栈顶存储空间,用于保存返回地址、被调层(函数)中的形参和局部变量的值。
(b)为被调层(函数)准备数据:计算实参的值, 并赋给对应的形参(在栈顶元素中)。(c)转入子程序执行。
在执行返回操作时, 内部实现如下:
(a)若函数需要求值,将其值保存到回传变量中。
(b)从栈顶取出返回地址,并退栈(同时撤消被调层子程序的局部变量及形参)。
(c)按返回地址返回。
(d)在返回后自动执行如下操作:若函数需要求值,从回传变量中取出所保存的值并传送到相应的实变参或位置上。