static void permute(int[] A, int k){
//[0, k-1] is prefix, [k, n) is for recursive call;
if(k==A.length-1){//递归结束条件
for(int v : A){
System.out.print(v);
System.out.print(",");
}
System.out.println();
return;
}
permute(A, k+1);//递归调用一次;
//将A[k]元素依次与[k+1, n)范围内的每个元素交换,递归
for(int i=k+1; i<A.length; ++i){
//swap A[k], A[i]
int tmp = A[k];
A[k]=A[i];
A[i]=tmp;
permute(A, k+1);
//swap back: 交换回来,其实倒也不用,可以直接与A[i+1]交换;
tmp = A[k];
A[k]=A[i];
A[i]=tmp;
}
}
public static void main(String[] args) {
int[] A = new int[]{1,2,3,4,5};
permute(A, 0);
}
测试运行:没有问题。
但是有个正确性证明问题:如何保证循环里的permute(A, k+1);子递归调用语句执行完后,范围[k+1, n)内的元素与递归调用之前相比,没有发生变化呢?