package com.aiqiongdiao;
public class Main {
/**
* 【递归】求n个元素的全排列
* abc acb bac bca cab cba
* @param args
*/
public static void f(char data[],int k){ //当前关注点k
if(k==data.length){
for(int i=0;i<data.length;i++){
System.out.print(data[i]+" ");
}
System.out.println();
}
//把第一个元素放这里,后面的元素再进行全排列
//后面的元素不能简单放过来:会覆盖!!交换即可。
for(int i=k;i<data.length;i++){ //循环中的递归就是出口
//将数组每个元素和后面的元素进行交换,然后递归
{char temp=data[k]; //试探
data[k]=data[i];
data[i]=temp;}
f(data,k+1);
/* {char temp=data[k]; //!!:此处不需要回溯
data[k]=data[i];
data[i]=temp;}*/
}
}
public static void main(String[] args) {
//将一个String改为char数组,打印所有排列形式
char data[]= "ABC".toCharArray(); //转化为char型数组语句
f(data,0); //传data数组
}
}
=======================================================
注意:
如果用逻辑的思路去理解很容易被绕进去。
所以现在用俯瞰大体的思想来理解它。
1.从k自身开始,与后面的交换
2.然后就将此行动退给下一级自动去做
3.每个元素都举行一次与后面元素交换元素的事,不需要回溯!!!