Loops 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

我将通过一个示例Java代码

打印给定字符串的所有可能排列(具有重复项 包括在内)

代码如下:

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
它首先调用递归,然后什么也不做,直到方法结束,所以它“保持打开”并等待,不增加任何内容