使用递归实现全排列
2013-01-19 16:44
176 查看
重新看了回递归之后,顺便写了个使用递归实现全排列的算法,感觉空间复杂度有点大,等有时间再更改吧,发表出来,因为算法功底实在有限,所以希望哪位可以帮忙优化优化,本人将感激不尽!
算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种
如:给定 A、B、C三个不同的字符,则结果为:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6种情况
代码如下:
算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种
如:给定 A、B、C三个不同的字符,则结果为:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6种情况
代码如下:
public class AllPermutation { public static void main(String[] args) { //使用递归完成全排列 char[] source=new char[]{'A','B','C'}; char[] result=new char[source.length]; allPermutation(0,source,result); } /** * * @param index当前考虑的数的下标(从0开始) * @param source * @param result */ public static void allPermutation(int index,char[] source,char[] result){ //当源数据中只有一个字符时,将该字符加入结果数组,并输出 if(source.length==1){ result[index]=source[0]; show(result); return ; } for(int i=0;i<result.length-index;i++){ result[index]=source[i]; char[] newSource=getNewSource(source,source[i]); allPermutation(index+1, newSource,result); } } public static void show(char[] result){ System.out.println(result); } /** * 生成去掉指定字符的新源数据数组 * @param source 原来的源数据数组 * @param c 指定去掉的字符 * @return */ public static char[] getNewSource(char[] source,char c){ char[] newSource=new char[source.length-1]; for(int i=0,j=0;i<source.length;i++){ if(source[i]!=c){ newSource[j]=source[i]; j++; } } return newSource; } }
相关文章推荐
- 使用递归实现数的全排列
- 使用递归实现全排列的算法
- 使用递归方法实现全排列
- [C++]数据结构实验01:使用递归实现简单的全排列
- 编写一个函数实现n^k,使用递归实现
- 非递归和递归实现全排列
- 全排列的递归实现
- 非递归实现不重复序列的全排列(三)
- 全排列——递归实现
- 递归实现 全排列
- 全排列的递归和非递归的实现
- 全排列的递归实现
- C#:通过递归和非递归算法实现按顺序输出的全排列
- 使用递归实现全排列输出
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
- JAVA语言之全排列的递归实现
- 剪切(使用File类的renameTo 方法和递归实现非空目录的剪切)
- 递归实现全排列
- 使用70行Python代码实现一个递归下降解析器的教程
- JavaScript使用递归和循环实现阶乘的实例代码