将1,2,3,4,5的各种排列顺序打印出来?如:12345,12354。应该有5!=120种吧(最好用递归) 将1,2,3,4,5的各种排列顺序打印出来?如:12345,12354。应该有5!=120种吧(最好用递归) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public void prints(int k1,int,k2,int k3,int k4,int k5){int i=0;if(k5!=0){ System.out.print(k1*10000+k2*1000+k3*100+k4*10+k5); return;for(i=1;i<=5;i++){if(k1==0) prints(i,k2,k3,k4,k5);else if(k2==0){ if(i==k1) continue; else prints(k1,i,k3,k4,k5);}else if(k3==0){ if(i==k2||i==k1) continue; else prints(k1,k2,i,k4,k5);}else if(k4==0){ if(i==k3||i==k2||i==k1) continue; else prints(k1,k2,k3,i,k5);}else if(k5==0){ if(i==k4||i==k3||i==k2||i==k1) continue; else prints(k1,k2,k3,k4,i);}}//for结束。} 我来贴一个:package jwolf.util;public class Test{ public static void main(String[] args) { char number[] = new char[]{'1','2','3','4','5'}; StringBuffer first = new StringBuffer(); // 递归函数执行 showSort(number,first); } /** * @param num 待处理的数组 * @param firstNum 在各个上级递归中逐渐追加形成的字符串 */ public static void showSort(char num[],StringBuffer firstNum){ for(int i=0;i<num.length;i++){ //依次把从0位到最后一位的数字交换到最前面 char temp = num[i]; num[i] = num[0]; num[0] = temp; //交换后取得第一个字符,把后面的字符重新组成一个数组 char num0 = num[0]; char newArray[] = new char[num.length-1]; for(int j=0;j<num.length-1;j++){ newArray[j] = num[j+1]; } //如果参数数组的长度为1,则输出结果 if(num.length==1){ String result = firstNum.append(num[0]).toString(); System.out.println(result); } //否则,把此次得到的第一个字符追加到传入的字符串,并递归调用 else{ StringBuffer sb = new StringBuffer(firstNum); showSort(newArray,sb.append(num0)); } } }} liuguangliang(小刀刘)的方法有局限性,不过能做出来就很列害了。chiefwolf(丢丢)方法很好,最后有个地方要改一下: StringBuffer sb = new StringBuffer(""+firstNum); showSort(newArray,sb.append(num0));谢谢了!!!!!!!!! 还在学习chiefwolf(丢丢)的方法,如果还有好的方法可以在贴出来。 import java.util.*;public class SortF{ String pailie[]={"1","2","3","4","5"}; int n=pailie.length; int numGraph[][]=new int[n][n];//二维数组来表示图 boolean judge[]=new boolean[n];//用来判断图中的结点是否在深度优先搜索队列中。 String result=""; ArrayList al=new ArrayList();//用来保存字符串结果 public static void main(String [] args){ new SortF().start(); }//初始化图中结点的关系,自身是不可以到达自身的;初始化判断数组。 public SortF(){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i==j) numGraph[i][j]=0; else numGraph[i][j]=1 ; } judge[i]=false; } } public void start(){ //始图中个结点都可以为第一个结点 for(int i=0;i<n;i++){ depthFirstSearsh(i);//有了第一个结点后,调用深度优先搜索。 } //遍历输出字符串。 Iterator ite = al.iterator(); while (ite.hasNext()) { String string = (String) ite.next(); System.out.println(string); } }//深度优先搜索 public void depthFirstSearsh(int startN){ judge[startN]=true;//设为true后,记录了本结点已经被访问 result=result+pailie[startN];//在result中增加一个字符串,当增加到N个时,则装入al中 if(result.length()==n){ al.add(result); } for(int i=0;i<n;i++){ if(numGraph[startN][i]==1&&judge[i]==false){//如果statN结点到i结点是连通的,且i结点未被访问 depthFirstSearsh(i);//以i结点为根,继续搜索 } } judge[startN]=false;//释放结点,使得深度优先搜索,返回到上一层。 result = result.substring(0, result.length() -1);//result去掉最后一个字符串 }} chiefwolf(丢丢)的不错... 比较规范,可读性也比较好 请问关于JAVA窗口间的数值传递 怎么打开.chm.download 关于socket读数据超时,求救啊~~!!!!!! 用java怎么求解质数? 要开发金融项目, 请教大家一下关于精确数值计算, 设计(数据库, 程序)时要注意的问题. 电子商务拉链系统的开发 abstract class和interface有什么区别 jb中的一个小问题,关于用向导的 没时间上网,考研,给点鼓励! Java项目工程出现一个红色的叹号 【100分求助】生成XML问题? 没高手还是我问得太弱智?
if(k5!=0){ System.out.print(k1*10000+k2*1000+k3*100+k4*10+k5);
return;
for(i=1;i<=5;i++){if(k1==0) prints(i,k2,k3,k4,k5);else if(k2==0){ if(i==k1) continue;
else prints(k1,i,k3,k4,k5);
}
else if(k3==0){ if(i==k2||i==k1) continue;
else prints(k1,k2,i,k4,k5);
}
else if(k4==0){
if(i==k3||i==k2||i==k1) continue;
else prints(k1,k2,k3,i,k5);
}
else if(k5==0){
if(i==k4||i==k3||i==k2||i==k1) continue;
else prints(k1,k2,k3,k4,i);
}}//for结束。
}
public class Test{
public static void main(String[] args) { char number[] = new char[]{'1','2','3','4','5'};
StringBuffer first = new StringBuffer();
// 递归函数执行
showSort(number,first);
}
/**
* @param num 待处理的数组
* @param firstNum 在各个上级递归中逐渐追加形成的字符串
*/
public static void showSort(char num[],StringBuffer firstNum){ for(int i=0;i<num.length;i++){ //依次把从0位到最后一位的数字交换到最前面
char temp = num[i];
num[i] = num[0];
num[0] = temp;
//交换后取得第一个字符,把后面的字符重新组成一个数组
char num0 = num[0];
char newArray[] = new char[num.length-1];
for(int j=0;j<num.length-1;j++){ newArray[j] = num[j+1];
}
//如果参数数组的长度为1,则输出结果
if(num.length==1){
String result = firstNum.append(num[0]).toString();
System.out.println(result);
}
//否则,把此次得到的第一个字符追加到传入的字符串,并递归调用
else{ StringBuffer sb = new StringBuffer(firstNum);
showSort(newArray,sb.append(num0));
}
}
}
}
chiefwolf(丢丢)方法很好,
最后有个地方要改一下:
StringBuffer sb = new StringBuffer(""+firstNum);
showSort(newArray,sb.append(num0));
谢谢了!!!!!!!!!
public class SortF{ String pailie[]={"1","2","3","4","5"}; int n=pailie.length; int numGraph[][]=new int[n][n];//二维数组来表示图 boolean judge[]=new boolean[n];//用来判断图中的结点是否在深度优先搜索队列中。 String result=""; ArrayList al=new ArrayList();//用来保存字符串结果 public static void main(String [] args){ new SortF().start(); }//初始化图中结点的关系,自身是不可以到达自身的;初始化判断数组。
public SortF(){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i==j) numGraph[i][j]=0;
else numGraph[i][j]=1 ;
} judge[i]=false;
}
} public void start(){ //始图中个结点都可以为第一个结点
for(int i=0;i<n;i++){
depthFirstSearsh(i);//有了第一个结点后,调用深度优先搜索。 }
//遍历输出字符串。
Iterator ite = al.iterator();
while (ite.hasNext()) {
String string = (String) ite.next(); System.out.println(string); }
}//深度优先搜索 public void depthFirstSearsh(int startN){ judge[startN]=true;//设为true后,记录了本结点已经被访问
result=result+pailie[startN];//在result中增加一个字符串,当增加到N个时,则装入al中
if(result.length()==n){
al.add(result); } for(int i=0;i<n;i++){
if(numGraph[startN][i]==1&&judge[i]==false){//如果statN结点到i结点是连通的,且i结点未被访问 depthFirstSearsh(i);//以i结点为根,继续搜索
}
} judge[startN]=false;//释放结点,使得深度优先搜索,返回到上一层。 result = result.substring(0, result.length() -1);//result去掉最后一个字符串
}}