递归算法笔记

递归算法

递归思想
拆解问题:大问题->小问题
求解:小问题->大问题
写递归方法的步骤
①明确函数的功能先不要去思考里面代码怎么写,首先搞清楚这个函数的干嘛用的,能完成什么功能?
②明确原问题与子问题的关系寻找f(n) 与f(n –1) 的关系
③明确递归基(边界条件)递归的过程中,子问题的规模在不断减小,当小到一定程度时可以直接得出它的解寻找递归基,相当于是思考:问题规模小到什么程度可以直接得出解?
例如
求前1~n之和
1+2+……+n

int sum(int n){
	if(n<=1) return n;
return n+sum(n-1)
}

分析复杂度
时间复杂度:O(n)
计算如下:
T(n)=T(n-1)+O(1)
而T(n-1)=T(n-2)+O(1)

T(n)=(T(n-2)+O(1))+O(1)
=……
……

=T(n-(n-1)))+(n-1)*O(1)
=T(1)+(n-1)*O(1)
=O(n)

空间复杂度:O(n) 因为递归次数为规模次数n
关于递归算法的空间复杂度计算通用公式:递归深度*辅助空间 O(1)

递归转非递归:
(1)自己维护栈来保存参数和局部变量
(2)重复使用一组相同变量来存储每个栈帧的内容

java中存在尾递归不存在尾调用
尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用栈帧,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用帧,取代外层函数的调用栈帧就可以了。

发布了9 篇原创文章 · 获赞 0 · 访问量 161

猜你喜欢

转载自blog.csdn.net/weixin_44855907/article/details/104526826