这是一个简单的“展开”:
输入序列是ABC,所以这样:
for(int i=start; i< str.length(); i++)
{
sb.append(str.charAt(i));
System.out.println(sb);
printAll(str, i+1, sb);
sb.setLength(sb.length()-1);
}
展开至此,start 设置为 0:
sb.append("ABC".charAt(0));
System.out.println(sb);
printAll("ABC", 1, sb); //Recursive call
sb.setLength(sb.length()-1);
sb.append("ABC".charAt(1));
System.out.println(sb);
printAll("ABC", 2, sb); //Recursive call
sb.setLength(sb.length()-1);
sb.append("ABC".charAt(2));
System.out.println(sb);
printAll("ABC", 3, sb); //Recursive call
sb.setLength(sb.length()-1);
鉴于长度为3,我们到此结束。但现在我们还需要展开递归调用:
sb.append("ABC".charAt(0)); // sb="A"
System.out.println(sb);
//Entering recursive call, start=1
sb.append("ABC".charAt(1)); // sb="AB"
System.out.println(sb);
//Entering recursive call, start=2
sb.append("ABC".charAt(2)); // sb="ABC"
System.out.println(sb);
//Enter recursive call, start=3
// 3 is not less than "ABC".length(), so we leave immediately
//Exit recursive call
sb.setLength(sb.length()-1); // sb="AB"
//Exit recursive call
sb.setLength(sb.length()-1); // sb="A"
sb.append("ABC".charAt(2)); // sb="AC"
System.out.println(sb);
//Enter recursive call, start=3
// 3 is not less than "ABC".length(), so we leave immediately
//Exit recursive call
sb.setLength(sb.length()-1); // sb="A"
//Exit recursive call
sb.setLength(sb.length()-1); // sb=""
sb.append("ABC".charAt(1)); // sb="B"
System.out.println(sb);
//Entering recursive call, start=2
sb.append("ABC".charAt(2)); // sb="BC"
System.out.println(sb);
//Enter recursive call, start=3
// 3 is not less than "ABC".length(), so we leave immediately
//Exit recursive call
sb.setLength(sb.length()-1); // sb="B"
//Exit recursive call
sb.setLength(sb.length()-1); // sb=""
sb.append("ABC".charAt(2)); // sb="C"
System.out.println(sb);
//Enter recursive call, start=3
// 3 is not less than "ABC".length(), so we leave immediately
//Exit recursive call
sb.setLength(sb.length()-1); // sb=""
有了这个完全“展开”,我们可以将它粘贴到 main 函数中并执行它,看到预期的结果。您还可以像我在 cmets 中一样,了解代码在每个步骤中的作用。