今天终于真正弄懂了递归的内部操作
下面通过两个列子来了解一下
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),但是前面已经没有堆栈了
所以这一层也结束了。即全部结束
假设上面的递归可以看成一个二叉树
总结一下
当我们进行递归处理时
如果递归的内部只含有一个递归时,没有堆栈,只需一直递归到条件
结束即可。
如果递归函数中有两个以上时
首先递归一个将其他的进行堆栈处理,当第一个的递归终止时
我们处理最后一层的堆栈,如果该堆栈可在分继续以前的操作,如果不可分
说明这一层结束,返回到上一次继续处理存在的堆栈,一直重复。
到最后一定会返回到第二层,会发现没有堆栈了,这就说明该递归结束。