【发布时间】:2016-11-15 07:17:47
【问题描述】:
我有一些代码
public class NameGenerator {
public static void main (String[] args)
{
List<String> result = new ArrayList<String>();
buildNameChoices("von.del.smith", result);
System.out.println(result);
}
public static void buildNameChoicesHelper(String[] nameArray, int nameIndex,
String firstName, String lastName, List<String> result) {
if(nameIndex >= nameArray.length) {
if(lastName.length() > 0) {
result.add(firstName + lastName);
}
}
else {
System.out.println("Calling first buildNameChoices");
buildNameChoicesHelper(nameArray, nameIndex + 1,firstName, lastName, result);
System.out.println("Calling second buildNameChoices");
buildNameChoicesHelper(nameArray, nameIndex + 1,firstName, lastName + "." + nameArray[nameIndex], result);
}
}
public static void buildNameChoices(String nameStr, List<String> result) {
String[] nameArray = nameStr.split("\\.", -1);
for(int i = 0; i < nameArray.length; i++) {
System.out.println("Inside for loop");
buildNameChoicesHelper(nameArray, i + 1, nameArray[i], "", result);
}
}
}
生成它所传递的名称字符串的所有可能组合。代码有效,我理解递归在某种程度上是如何工作的,但是双重递归调用真的让我感到困惑。我已经看了很长时间了,但我很难准确地理解它在做什么。对此的任何帮助将不胜感激。试了调试,还是看不懂。
【问题讨论】:
-
你不明白的到底是什么?双递归的概念?或者为什么这种特殊情况有效?
-
几乎是整个概念。我真的不明白什么时候调用第二个。是直接在第一个之后吗?还是第一个调用基本情况,然后第二个调用?
-
试试看this,这是对双递归的一个很好的解释。
-
谢谢,我确实看过那个问题,但我仍在为这个概念而苦苦挣扎。也许如果我继续看它,它会开始点击。
-
如果您从堆栈帧(运行方法的实例)的角度来考虑,每当进行递归调用时,堆栈顶部都会放置另一个帧。在双递归的情况下,一次仍然只有一个堆栈,但堆栈会在原始方法结束之前增长和收缩多次。这是因为当在原始方法中进行第一次递归调用时,它必须在执行该方法中的第二次递归调用之前解决该调用。在原始方法调用的方法中进行递归调用也是如此。