递归的内部实现

今天终于真正弄懂了递归的内部操作

下面通过两个列子来了解一下

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),但是前面已经没有堆栈了
所以这一层也结束了。即全部结束

假设上面的递归可以看成一个二叉树

总结一下
当我们进行递归处理时
如果递归的内部只含有一个递归时,没有堆栈,只需一直递归到条件
结束即可。
如果递归函数中有两个以上时
首先递归一个将其他的进行堆栈处理,当第一个的递归终止时
我们处理最后一层的堆栈,如果该堆栈可在分继续以前的操作,如果不可分
说明这一层结束,返回到上一次继续处理存在的堆栈,一直重复。
到最后一定会返回到第二层,会发现没有堆栈了,这就说明该递归结束。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值