当有2个递归语句如下面的程序时,如何执行递归?

我之前发过一个问题但是我不够清楚。 我很抱歉这个混乱,但我的意思是,如果有一个程序,如:

TreeNode createMinBST(int arr[], int start, int end) { if(end< start) return null; int mid = (start+end)/2; Treenode n= new Treenode(arr[mid]); n.left= createMinBST(arr, start, mid-1) //LINE a n.right= createMinBST(arr, mid+1, end); //LINE b return n; } 

LINE a和LINE b是如何展开的(就像在编码面试书中所说的那样)或它是如何工作的? LINE a是否一直到基本情况并返回值,然后LINE b执行? 或者两个递归语句同时归结为基本情况?

如果有人可以解释从上面给出的代码创建最小BST的明确路径,那么理解多个递归语句(这里是2-线a和线b)是如何发生的将是非常有帮助的。

非常感谢

查看代码,您构建树的方式与“深度优先搜索”的方式相同。 所以你要更深入(在你的情况下留下了东西),直到没有更多的元素要处理,然后你回到一个级别,然后再次向下。

(顺便说一句,你的’A行’在结尾处缺少一个分号)

通常情况下,当学习或试图弄清楚递归调用是如何工作时,打印出来是很方便的。

例如,如果您的起始数组包含[10..24]中的数字,那么您的调用可能如下所示:

 Calling minBST on 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 Calling minBST (left) on 10, 11, 12, 13, 14, 15, 16 Calling minBST (left) on 10, 11, 12 Calling minBST (left) on 10 Calling minBST (right) on 12 Calling minBST (right) on 14, 15, 16 Calling minBST (left) on 14 Calling minBST (right) on 16 Calling minBST (right) on 18, 19, 20, 21, 22, 23, 24 Calling minBST (left) on 18, 19, 20 Calling minBST (left) on 18 Calling minBST (right) on 20 Calling minBST (right) on 22, 23, 24 Calling minBST (left) on 22 Calling minBST (right) on 24 

代码按顺序执行。

因此,第一次n.left ,它必须在执行下一行之前执行该语句。 这意味着是的,它“保存”了它的位置并且在完成 n.left线之前从n.left一直沿着递归树向下移动然后可以继续执行(在n.right )。

user9889052做了很好的追踪。 更简单的答案是从上到下。 在返回顶部递归(在每个级别)之前,将不执行下面的递归。

按照惯例,我会说左边总是最顶尖的陈述。

事实上,递归只不过是一棵树。

  Root / \ RecurA RecurB / \ RecurAa RecurAb / \ RAaa RAaab / \ dead dead 

编辑当达到死(返回)时,它向右移动,直到同一级别的所有节点都“死”(返回所有递归语句),它返回一级,并展开RAaab

旁边的问题:你能猜出这棵树的深度吗? 这变得很明显,如果子问题不好,递归可能会有问题。

递归工作从每次调用(每个级别调用)起,都会创建一个堆栈帧。 上一级别的信息是“存储”的。 当您开始弹出时(向后移动,当您点击返回语句时),现在可以恢复为上一级别保存的信息。 该机制比这个简单的描述复杂得多。

起初,MinBST可能是一个坏主意。 请尝试此递归。

 Given an array [3,4,9,2,0,11,8,-1,2,4] Partition this array in halves until size of each partition is one Then give the sum of the left and right partition as they return (at each level)