一、递归
1.1递归的定义
递归是一个重要的程序设计方法,简单的说,若一个函数、过程或者数据结构的定义中又应用了他自身,那么这个函数、过程或数据结构称为是递归定义的,简称为递归(自己调用自己)
它通常把一个大型的复杂的问题层层转化为一个与原本问题相似的规模较小的问题来求解,递归的策略只需要少量的代码就可以描述出解题过程中多需要的多次重复的计算,大大减少了程序的代码量,但是通常情况下,他的效率并不高
1.2递归的条件
递归的精髓是在于能否将原始问题转换为属性相同但是规模较小的问题
必须注意递归模型不能是循环定义的,其必须满足下面的两个条件:
- 递归表达式(递归体)
- 边界条件(递归出口)
1.3递归的过程
在递归调用的过程中,系统为每一层的返回点,局部变量,传入实参达尔博格开辟了递归工作栈来进行数据的恶存储,递归次数过多容易造成栈溢出等。
而其效率不高的原因是递归调用过程中包含了很多重复的计算
抽象:上级给下级打电话让人去买水
打电话函数(上级,下级){
if(买到水了)
返回上级
else
打电话函数(上级,下级)//同一个打电话函数,但是是不同的上级下级
}
阅读下列递归算法,给出调用passIT(7,7)的执行过程
int passIT(int r,int s){
int u;
print(r,s);
if((r<=0 || s<=0){
u = r+s;}
else if(r>s){
u = passIT(r-3,s-2)+s;}
else{
u = passIT(r-2,s-3)+r;}
printf(u);
return(u);
}
现在让我们一起来理解此递归的函数吧~
首先进入int passIT(7,7),定义了一个整型u
输出7,7,此时if、else if语句中的条件都不满足,执行else语句u = passIT(7-2,7-3)+7,得出等于u = passIT(5,4)+7,得出r=5,s=4;
整合写成:
调用passIT(7,7)
r=7,s=7;
u=passIT(5,4)+7;
r=5,s=4;
接着再次调用,将数据传入得int passIT(5,4),定义整型u,
输出5,4,此时满足r>s,执行else if语句,u=passIT(5-3,4-2)+4,得出
等于u=passIT(2,2)+4,得出r=2,s=2;
整合写成:
调用passIT(7,7)
r=7,s=7;
u=passIT(5,4)+7;
r=5,s=4;
u=passIT(2,2)+4
r=2,s=2;
接着再次调用,将数据传入int passIT(2,2),定义整型u,
输出2,2,继续走else语句,u=passIT(0,-1)+2;
整合写成:
调用passIT(7,7)
r=7,s=7;
u=passIT(5,4)+7;
r=5,s=4;
u=passIT(2,2)+4
r=2,s=2;
u=passIT(0,-1)+2
r=0,s=-1;
此时满足第一个if条件,执行u=0+-1=-1
接着print(-1);
return(-1);
接着return交给上一层u=passIT(0,-1)+2
此时passIT(0,-1)=-1,得出u=-1+2=1
接着print1
return(1)
接着return交给上一层u=passIT(2,2)+4
passIT(2,2)=1,得出u=1+4=5
print5
return(5)
接着return给上一层 u=passIT(5,4)+7;
passIT(5,4)=5,5+7=12
print12
return12,此时12不需要输出
若写成int ans = possIT(7,7);print(ans)则输出