浅谈巧妙算法:递归(1)

2021.7.28

何为递归

递归是函数和过程调用自身的一种特殊形式,即允许函数和过程进行自我调用。其特点是抽象性和简洁性,很多时候可以大大降低时间复杂度,获得较优解。

如何选择和应用不同的递归

常见的有:线性递归,二分递归,多分枝递归等
下面进行逐一介绍…

1.线性递归:这种形式中,应用问题总可以分解为两个独立的子问题,即减而治之。通过将一个大问题不断分解成小问题,小问题分解为更小的问题…最终退化为简单问题。
eg:数组求和~计算给定n个数的总和

int sum(int A[], int n){
	if(n<1) //平凡情况
		return 0;//平凡情况,递归基
	else //一般情况
		return sum(A, n-1) + A[n-1];//递归:前n-1项之和,再累计第n-1项
}

*线性递归:算法sum()可能朝着更深一层进行自我调用,且每一递归实例对自身地调用最多一次。于是每一层次上最多有一个实例,且它们构成一个线性的次序关系,因而叫做线性递归。

递归算法最重要的是要保证其有穷性,其基本技巧:首先判断处理平凡情况(如n=0之类),以免因无限递归导致系统溢出。这类平凡的情况叫做

递归基
*平凡的情况可能有很多种,但至少会有一种,且必然出现。

*减而治之:此处sum函数随着递归深入,调用函数将单调地递减。因此无论输入n有多大,递归的调用总次数是有限的,故算法迟早终止,满足有穷性。当抵达递归基时,算法执行的是非递归计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值