今天终于真正弄懂了递归的内部操作
下面通过两个列子来了解一下
void fun(int n)
{
printf("1\n");
if(n<4)
fun(n+1);
printf("2\n");
}
执行f(1)操作
1
1
1
1
2
2
2
2
这个很容易懂,直到执行完,每次回到上一个都是结束
假设含有两个递归函数
void sort(int a[],int start,int end)
{
int mid;
mid=(start+end)/2;
if(start>=end) {printf("0\n");return ;}
else
{
printf("1\n");
sort(a,start,mid);
printf("2\n");
sort(a,mid+1,end);
printf("3\n");
}
}
打印出来的数字
1
1
1
0
2
0
3
2
0
3
2
1
0
2
0
3
3
假设数据a[]={1,3,4,6,2}
首先将该数组分成两份(1,3,4)和(6,2)
然后将(1,3,4)接着分,(6,2)实则进行堆栈处理
(1,3,4)分为(1,3)和(4),然后将(4)堆栈处理
接着分(1,3)为(1)和(3).将(3)进行堆栈处理
然后发现1不可分,然后返回到前一个堆栈即(3)
发现(3)也不可分,即这一层结束(1,3)这一层
然后再回到前一个堆栈 即(4)
发现(4)也不可分,即(1,3,4)这一层结束
然后再回到上一个堆栈 即(6,2)
显然(6,2)可在分 即(6,2)分为(6)和(2)然后将(2)
堆栈,继续分(6),发现(6)不可再分
然后返回到前一个堆栈即(2),(2)分发现也不可分,
即(6,2)这一层结束,返回到前一个堆栈(1,3,4,6,2),但是前面已经没有堆栈了
所以这一层也结束了。即全部结束
假设上面的递归可以看成一个二叉树

总结一下
当我们进行递归处理时
如果递归的内部只含有一个递归时,没有堆栈,只需一直递归到条件
结束即可。
如果递归函数中有两个以上时
首先递归一个将其他的进行堆栈处理,当第一个的递归终止时
我们处理最后一层的堆栈,如果该堆栈可在分继续以前的操作,如果不可分
说明这一层结束,返回到上一次继续处理存在的堆栈,一直重复。
到最后一定会返回到第二层,会发现没有堆栈了,这就说明该递归结束。
本文深入解析递归函数的工作原理,通过具体示例展示单递归与多递归的区别,以及递归过程中的堆栈处理机制。
2052

被折叠的 条评论
为什么被折叠?



