(五)数据结构-栈在递归中的应用

一、递归

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
输出77,此时ifelse 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,
输出54,此时满足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,
输出22,继续走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)=55+7=12
print12
return12,此时12不需要输出

若写成int ans = possIT(7,7);print(ans)则输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值