Loops Java变量未在循环外保留值
我将通过一个示例Java代码 打印给定字符串的所有可能排列(具有重复项 包括在内) 代码如下:Loops Java变量未在循环外保留值,loops,pass-by-value,Loops,Pass By Value,我将通过一个示例Java代码 打印给定字符串的所有可能排列(具有重复项 包括在内) 代码如下: public class StringPermutationWithRepetition { public static void main(String[] args) { String dictionary = "ABC"; printPermutation(dictionary, ""); } public static void
public class StringPermutationWithRepetition {
public static void main(String[] args) {
String dictionary = "ABC";
printPermutation(dictionary, "");
}
public static void printPermutation(String str, String stringToPrint) {
System.out.println("The permutation now is: "+stringToPrint);
if (str.length() == stringToPrint.length()) {
System.out.println(stringToPrint);
return;
}
for (int i = 0; i < str.length(); i++) {
printPermutation(str, stringToPrint + str.charAt(i));
}
}
}
问题:我无法理解输出的这一部分:
The permutation now is:
The permutation now is: A
The permutation now is: AA
The permutation now is: AAA
AAA
The permutation now is: AAB
AAB
The permutation now is: AAC
AAC
The permutation now is: AB
The permutation now is: ABA
ABA
The permutation now is: AAA
AAA
The permutation now is: AAB
AAB
i、 e.在下列情况下:
stringToPrint='AA'
和str.charAt(i)='A'
然后再次对函数进行递归调用:
printPermutation(str, stringToPrint + str.charAt(i));
输出为:
The permutation now is: AAA
AAA
而stringToPrint='AAA'
但是一旦遇到返回
,循环就会再次开始:
return;
}
for (int i = 0; i < str.length(); i++) {
printPermutation(str, stringToPrint + str.charAt(i));
}
返回;
}
对于(int i=0;i
stringToPrint
的值返回到'AA'
。为什么呢
我有一种直觉,这与Java是按值传递而不是按引用传递有关。当您执行
stringToPrint+str.charAt(I)
时,它会创建一个新字符串,并且不会修改stringToPrint的值。当然,在方法调用中,新stringToPrint的值是不同的,但这在不同的范围内。您可能误解了递归。在这种情况下,它的工作原理类似于“DFS”,它进入第一个可能的解决方案。当没有解决方案时,它会后退一步
printPermutation("ABC","")
---> printPermutation("ABC","A")
---> printPermutation("ABC","AA")
---> printPermutation("ABC","AAA")
---> (str.length() == stringToPrint.length()); //ends
---> printPermutation("ABC","AAB")
---> (str.length() == stringToPrint.length()); //ends
---> printPermutation("ABC","AAC")
---> (str.length() == stringToPrint.length()); //ends
---> printPermutation("ABC","AB")
---> printPermutation("ABC","ABA")
---> (str.length() == stringToPrint.length()); //ends
//etc
记住当你这样做的时候
for (int i = 0; i < str.length(); i++) {
printPermutation(str, stringToPrint + str.charAt(i));
}
for(int i=0;i
它首先调用递归,然后什么也不做,直到方法结束,所以它“保持打开”并等待,不增加任何内容