【发布时间】:2017-10-10 21:23:28
【问题描述】:
我有下面的代码,它的功能如下:你调用方法并给它一个数字。它会打印出你给它的数字的所有排列。
例如:你调用这样的方法:
排列(3)
它会打印出来:
123、132、213、231、312、321、
代码如下:
public static void main(String[] args) {
permutations(3);
}
public static void permutations(int n) {
boolean used[] = new boolean[n]; //all set to false by default
int perm[] = new int[n];
permutations2(used, 0, perm);
}
private static void permutations2(boolean used[], int index, int perm[]) {
if (index == used.length) {
for (int i = 0; i < perm.length; i++) {
System.out.print(perm[i] + "");
}
System.out.print(", ");
return;
}
for (int i = 0; i < used.length; i++) {
if (!used[i]) {
used[i] = true;
perm[index] = i + 1;
permutations2(used, index + 1, perm);
used[i] = false;
}
}
}
我的问题是返回声明。每当由于某种原因调用返回时,变量“索引”就会发生变化。谁能向我解释为什么会这样?代码工作正常,我只是很难理解如何。
抱歉英语不好。
【问题讨论】:
-
这是一个递归算法,因此
index的新值作为参数被压入堆栈,但对于调用者,该值保持不变。提示:在你的 IDE 中在递归调用之前设置一个断点,看看函数是如何变得更深然后返回的。 -
它不会改变。如果您可以准确地说明是什么让您认为它确实如此,我们也许可以解释。请记住,您多次调用同一个函数,堆叠在自身上,并且每个函数都有自己的变量副本。
-
'index' 的值不会改变,只要你不给它赋值就不会改变!