1.什么是递归
1.1递归的思想
把一个大型复杂问题层层转化为一个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了。递归就是递推回归的意思。
1.2递归的限制条件
- 递归存在限制条件,当满足这个限制条件时,递归就不再继续。
- 每次递归调用之后越来越接近这个限制条件。
2.递归举例
2.1求n的阶乘
int Fact(int n)
{
if(n==0)
return 1;
else if(n>0)
return n*Fact(n-1);
}
栈溢出:每一次函数调用都要为这个函数调用分配内存空间,是内存栈区上分配的,如果无限的递归调用函数,就会将栈区空间填满,这时就出现了栈溢出现象。
C语言中每一次函数调用都需要为本次函数调用在内存的栈区申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间称为运行时堆栈,或者函数栈帧。
函数不返回,函数对应的栈帧空间就一直被占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用搜会开辟属于自己的栈帧空间,直到函数递归不再继续才逐层释放。
2.2顺序打印一个数
//...头文件
void p(int n )
{
if(n>9)
p(n/10);
printf("%d ",n%10);
}
int main()
{
int n=0;
cin>>n; //n=123
p(n);
}
//先打印1,返回在打印2,...
3.递归与迭代
3.1迭代求n的阶乘
int fact(int n)
{
int i=0;
int r=1;
for(i=1;i<=n;i++)
{
r=r*i;
}
return r;
}
拓展:青蛙跳台阶问题(斐波那契)/ 汉诺塔问题