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我编辑了我的问题,添加了堆栈的行为。