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

时间:2012-01-07 17:48:47

标签: java recursion

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

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)是如何发生的将是非常有帮助的

非常感谢

3 个答案:

答案 0 :(得分:5)

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

(顺便说一句,你的'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

答案 1 :(得分:1)

代码按顺序执行。

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

答案 2 :(得分:1)

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)