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



我以为我理解递归,直到我开始使用这种方法。我对这件事的时机完全目瞪口呆,因此向你们寻求帮助。

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 或更小的字符串调用递归函数,则它严格不执行任何操作。

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

字符串"la-la-la"的长度为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

最新更新