Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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 双重递归调用,在这些调用之间打印系统输出Ap计算机科学_Java_Recursion - Fatal编程技术网

Java 双重递归调用,在这些调用之间打印系统输出Ap计算机科学

Java 双重递归调用,在这些调用之间打印系统输出Ap计算机科学,java,recursion,Java,Recursion,我以为我理解递归,直到我找到了这个方法。我被这件事的时机弄得目瞪口呆,因此我请求你们的帮助 public static void mystery5(String sWord) { int nL = sWord.length(); if(nL >= 3) { mystery5(sWord.substring(0, nL/3)); System.out.println(sWord.substring(nL/3, 2*nL/3));

我以为我理解递归,直到我找到了这个方法。我被这件事的时机弄得目瞪口呆,因此我请求你们的帮助

public static void mystery5(String sWord)
{
    int nL = sWord.length();
    if(nL >= 3)
    {
         mystery5(sWord.substring(0, nL/3));
         System.out.println(sWord.substring(nL/3, 2*nL/3));
         mystery5(sWord.substring(2*nL/3));
    }
}

public static void main(String[] args)
{
    mystery5("la-la-la");       
}
输出为:

-la 
l

首先,让我们注意,如果使用长度为2或更少的字符串调用递归函数,则严格来说它什么也不做

其次,让我们用一些变量的值替换它们,以便更好地理解这一点:

这根弦的长度是8

整数算术中的8/3==2

2*8/3==16/3==5

因此,在第一次调用1中,我们有:

     mystery5(sWord.substring(0, 2));
     System.out.println(sWord.substring(2, 5));
     mystery5(sWord.substring(5));
这意味着:

     mystery5("la");            // let's name this "2A", it will not print anything
     System.out.println("-la"); // prints "-la"
     mystery5("-la");           // let's name this "2B", this will do something
你能自己做第二个电话吗?和我刚才做的一样

如果您一步一步地进行,堆栈将如下所示,mystery5调用的名称如上所述:

START
main
main - "1"
main - "1" - "2A"
main - "1"     -----> print "-la"
main - "1" - "2B"
main - "1" - "2B" - "3A"
main - "1" - "2B"    ----> print "l"
main - "1" - "2B" - "3B"
main - "1" - "2B"
main - "1"
main
END

是的,这是java,我的好sirI,当你完成第一个方法并进入第二个方法时,我不理解堆栈是如何工作的。第二种方法是如何可视化/一步一步地工作的?@RushilVellala您调用的第一种和第二种方法是什么?你说的是主要的和神秘的吗?或者对mystery5的不同调用?另外,仅供参考,int total mystery5被调用了5次。第一个呼叫来自main,第二个呼叫来自此第一个呼叫。后面的第一个调用不起任何作用,但是第二个调用将起作用,因为-la的长度是3。它会另外两次调用mystery5。你能用调试器一步一步地处理代码吗?同时,我将试图澄清堆栈上发生了什么。@Rushilvella我编辑了我的问题,添加了堆栈的行为。