分析系统栈
归并排序的核心就是:从里往外,依次排序,它就是一个二叉树的结构。
递归是如何构造树结构的?
程序线程运行的逻辑就是一个中序遍历的过程,左->根->右,递归的过程就是一个树形成的过程,在这边我们把左区域代码放在右区域代码的前面,线程只要进入左区域递归,它就会一直把左区域的整个大树都遍历完,才开始开辟右边这一个大树的栈。线程不断调用线程,所以它遵循的正是一个中序遍历的过程。只有当最顶层的左节点整个遍历完,程序才会接着开一个右节点的栈来构造右边一整个树的结构。
那么根在程序中是如何反应出来的?
根节点主要反应在程序的线程回收上,递归肯定有一个”触底条件”(也就是最终return的条件),在线程return以后,剩下没执行完的线程就会从后往前(栈的后进先出原则)挨个继续执行,所以最底部(n)这个return了以后,紧接着就是n-1接着运行没运行完的代码,那很明显n-1没运行的代码正是第8行这个遍历右区域的代码。所以代码先后顺序决定树的遍历是(左->根->右 / 右->根->左),而根的反应是在系统栈出栈的一个顺序,出栈是后进先出,所以最后那个线程return了以后,就自动回到上一个没执行完的线程(也就是根节点),继续执行代码。
https://zhuanlan.zhihu.com/p/124356219
关键字:线程从后往前回收,开辟系统栈,中序遍历。
递归
- 递归的底层是一个栈结构,两个递归就是两个栈,并且必须是第一个栈整个运行结束,第二个栈才开始构建,它们是独立的。也是有先后顺序的,第一个栈优先于第二个栈,但往往都是一个树的结构,都是按照递归方法代码的置放顺序来确定优先级别,比如归并排序中,左递归置放在右递归的上面,那么优先级别就是,从左往右,从上往下(每一层分析都要看父结构的优先级,如果n+1层的右节点是在n层的左节点下,n+1这个右节点在n+1左节点运行完就要接着运行)
- 栈的特点是后进先出。每一个分支(每一个递归方法)都是互不相干的两个栈
- 多少个递归就是几叉树,都可以构图。
- 模拟中序遍历过程(中序遍历的过程就是系统压栈的过程 - 归并排序)
- 感染:
1.如果我们每一层的数都不重,自然不会感染(指数型枚举)
2.(排列数字)
进的时候,我们肯定要挨个感染,因为我们要防止复用,复用了还叫排列数字吗,也就是每一层用的数字都必须不一样,层数=位数
出的时候,如果我们数是重复使用的,则通过递归最后一行的释放false来复原。只要最后一个代码是设置false,那么线程在回溯的过程中必定会经过false,下一层回溯到上一层的过程中,下一层使用过的数会被全部还原为false,从而每一个进程复用的数都不会被其他进程感染到
递归的结束
递归的结束有两种情景,结束也就是树结构回溯的过程,
1.最底层的是因为return回溯
2.中间层的非二叉树结构的,是因为下一层return从而也结束