Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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,我正在努力遵循这个“据说很简单”的递归过程 void display(int x, int y) { int[] a = {0,1,2,3}; if(x==y) { System.out.print(a[x]+" "); } else { int mid=(x+y)/2; display( x, mid); display( mid+1, y); } 在第一次打印语句x=0、y=0和mid=0之后,我理解了这一点。下一个呼叫显示为第二个呼叫

我正在努力遵循这个“据说很简单”的递归过程

void display(int x, int y) {
   int[] a = {0,1,2,3};
   if(x==y) {
      System.out.print(a[x]+" ");
   }
   else {
   int mid=(x+y)/2;
   display( x, mid);
   display( mid+1, y);
}

在第一次打印语句x=0、y=0和mid=0之后,我理解了这一点。下一个呼叫显示为第二个呼叫显示(mid+1,y);现在突然y=1-这个变化发生在哪里-print语句被执行,然后y=3的值被执行。显然,调试器不是遵循这个的最佳方式-我理解factoral示例中发生了什么,并且可以在纸上和笔上进行跟踪-是否可以看到这个示例中发生了什么?任何帮助都将不胜感激。

只需使用“二进制搜索”算法按顺序遍历所有元素,然后打印出每个元素。我认为结果就是从索引
x
y
的所有元素

请注意,
mid
这个词是一个提示:如果你取两个事物的平均值并取中间值,那么你的原始变量可能分别是
start
end
。因此,请尝试重写它:

void display(int start, int end)
{
    int[] a = { 0, 1, 2, 3 };
    if (start == end)
    {
        System.out.print(a[start] + " ");
    }
    else
    {
        int mid = (start + end) / 2;
        display(start, mid);
        display(mid + 1, end);
    }
}

它看起来应该更明显一些:你把数组分成两半,在每一半上调用你自己,当一半的长度为1时,你在那个位置打印值。

你应该试着在函数的开头打印
x
y
mid

您还可以按照@Mehrdad的建议复制粘贴,或者绘制一棵树(一棵二叉树,因为每个调用只会导致0或2个以上的调用)

扰流板:

             (0,[1],3)
            /         \
    (0,[0],1)         (2,[2],3)
   /         \       /         \
(0,0)       (1,1) (2,2)       (3,3)
--

我最初是这样写的,然后觉得你可能不需要它。现在我想你会:

x
y
是函数的参数。因此,每个调用都有自己独立的
x
y
。在这种情况下,将有7个
x
s和7个
y
s(与树一起检查)


至于“跳跃”,这对我来说太难解释了,对不起,但它很简单:一根树枝结束,另一根树枝开始。(因此,当
(1,1)
结束时,
(0[0],1)
也结束,并且
(0[1],3)
进行第二次调用,
(2[2],3)
-这是从1到3的“跳转”)

“在第一次打印语句x=0和y=0之后”-仅当初始调用是
显示(0,0)
@Matt-对不起,我是说在if语句为真后的第一次调用是(0,3)。是的,它就是这样做的-我的问题是我试图跟随x,y和mid变量-但由于递归性质,我不明白为什么变量y在if语句后突然从0跳到1,然后从1跳到3。@永远困惑:如果有帮助,请尝试“展开”函数--复制/粘贴递归调用发生的内部内容,所以它看起来更明显。@Mehrdad-谢谢你试图帮助我理解这一点-我觉得有点愚蠢,肯定错过了一些明显的东西。我可以问你,我是否正确地解释了这一点-@永远困惑:你没有错过任何明显的东西-递归可能是许多新程序员编程中最困难的方面之一。让我试试看我是否能想出另一种解释的方法如果我能,我会试着把它贴出来。@Mehrdad-谢谢你试着帮我理解这一点-我觉得有点傻,肯定错过了一些明显的东西。请问我是否正确地解释了这一点-第一次显示被称为start=0和end=1,下一次显示start=0和end=0,所以第一个元素被显示出来。这是我的问题-下一个调用是第二个显示(mid+1,end)为什么end现在等于1-为什么不是上次执行时的0?我在这里遗漏了什么:(这现在更有意义了!非常感谢你。