递归在算法中是很重要的一个思想,任何高级算法的实现要想代码看起来简洁离不开递归,今天我们就来说说它。
一、理解递归
- 如何去理解递归思想:
- 我们可以画图来理解它,将每一次的过程通过画图来展现,那么思想应该可以理解了。
- 通过函数栈帧理解,可以通过它来看每个变量的变化,但是必须要明确每个栈帧的n不是同一个n,递归时我们不断地开辟栈帧,满足条件后,不断释放栈帧,进行回退。如下图:
2. 存在无穷递归吗?
我们知道递归和循环之间是可以替换的。代码中常常会遇到无限循环,在无限循环时不会造成其他进程运行,始终一个程序,所以不会开辟新栈帧。如while(1){}等,但是我们不会存在无限递归,原因时递归需要开辟栈帧,每一个电脑的栈大小是有限的,所以会存在栈溢出的风险,故不会存在无限递归。
3. 如何修改栈大小?
(1)linux下默认栈大小为10MB,修改栈大小:
ulimit -a #显示当前用户的栈大小
ulimit -s 32768 #将当前用户的栈大小设置为32M bytes
(2) Windows下栈大小为1MB,在windows平台下,栈的大小的信息是包含在可执行文件中的。它可以在Visual C++的编译过程中设置,但是在gcc中是不可行的。修改栈大小:
选择 “Project->Setting”.
选择 “Link”.
选择 "Category"中的 “Output”.
在 "Stack allocations"中的"Reserve:"中输栈的大小,例如: 32768
二、分析递归
在递归时我们会经常使用到i++ ,++i,i+1,我们分析以下有何不同,注意分析的时候,如果传入的参数不是引用,那么我们就进行层次分析但是代码是深度运行的,层次分析就是沿着代码走,不要去进入函数递归,比如一个节点,你考虑完左边就去考虑右边,不要左边递归左边,一直把左边考虑完,这个就变成深度分析了。是引用我们就深度分析。
我们以这一段代码来分析
- i+1的情况
int fun(int i,int n)
{
if(i>=n)
{
//cout<<i<<endl;
return i;
}
else
{
fun(i+1,n);
//cout<<"fun1 "<<i<<endl;;
fun(i