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

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

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

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

递归的内部实现

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

 

相关文章:

  • 2021-11-08
  • 2021-07-19
  • 2021-12-20
  • 2022-01-06
  • 2021-12-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-27
  • 2021-04-12
  • 2022-02-02
  • 2022-12-23
  • 2021-07-05
  • 2021-05-06
  • 2021-11-14
相关资源
相似解决方案