Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当有两个递归语句(如下面的程序)时,递归是如何执行的?_Java_Recursion - Fatal编程技术网

Java 当有两个递归语句(如下面的程序)时,递归是如何执行的?

Java 当有两个递归语句(如下面的程序)时,递归是如何执行的?,java,recursion,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)

我之前发布了一个问题,但是我不够清楚。很抱歉造成混淆,但我的意思是,如果有一个程序,如:

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;
}
TreeNode createMinBST(int-arr[],int-start,int-end){
如果(结束<开始)返回null;
int mid=(开始+结束)/2;
Treenode n=新的Treenode(arr[mid]);
n、 left=createMinBST(arr,start,mid-1)//行a
n、 right=createMinBST(arr,mid+1,end);//行b
返回n;
}
a行和b行是如何展开的(就像在《编程面试书》中所说的),或者它是如何工作的?行a是否一直到基本情况并返回值,然后执行行b?或者两个递归语句同时下到基本情况

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


非常感谢

代码按顺序执行


因此,第一次命中
n.left
时,它必须在执行下一行之前执行该语句。这意味着是的,它在完成
n.left
行之前,会“保存”它的位置,并从递归树一直往下走,然后可以继续执行(继续执行到
n.right
)。

查看您正在构建树的代码,方法与“深度优先搜索”相同。所以,你要更深入(在你的例子中,德珀在左边),直到没有更多的元素需要处理,然后你要返回一个级别,然后再返回

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

用户9889052做了一个很好的跟踪。简单的答案是自上而下。在返回顶层递归(在每个级别)之前,将不会执行下面的递归

按照惯例,我会说左派总是最重要的

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

                            Root
                     /                    \
                  RecurA                RecurB
               /         \
        RecurAa        RecurAb
        /     \
      RAaa    RAaab
    /     \
  dead    dead
编辑 当到达dead(return)时,它会向右移动,直到同一级别的所有节点都“dead”(返回所有递归语句),它会返回上一级别,并展开RAaab

旁白:你能猜出这棵树的深度吗?这就很明显,如果子问题不好,为什么递归会有问题

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

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)

你为什么不直接按照程序流程来做呢?或者通过在调试器中单步执行来观察实际发生的情况。@Mat的可能副本-当我的问题因为不够清楚而结束时,我再次在这里发布了它。@user807496:拿一张纸,每次调用函数时都画一个框,并用一条线将其连接到“父函数”。在每个框中,记下参数的当前值。这就是如何理解程序流。@cplearner比学习如何使用调试器更重要的是学习如何在纸上/在你的思想中跟踪代码。a) 这将首先帮助您编写更好的代码(因此可能根本没有调试器)和b)有一天,您会遇到调试器无法帮助您的情况(今天,它不仅是真正的低级别操作系统或嵌入式系统—您无法在调试器中调试数据竞争)。所以他应该听从奥利的建议,抓起一张纸!(但后来学习如何使用调试器并检查是否正确也无妨:)良好的分析…现在奖励自己一个好的SO显示名称:)@Paul:啊,我很快就会这么做:)