将1,2,3,4,5的各种排列顺序打印出来?如:12345,12354。应该有5!=120种吧(最好用递归)

解决方案 »

  1.   

    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结束。

      

  2.   

    我来贴一个: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));
                }
            }
        }
    }

      

  3.   

    liuguangliang(小刀刘)的方法有局限性,不过能做出来就很列害了。
    chiefwolf(丢丢)方法很好,
    最后有个地方要改一下:
                    StringBuffer sb = new StringBuffer(""+firstNum);
                    showSort(newArray,sb.append(num0));
    谢谢了!!!!!!!!!
      

  4.   

    还在学习chiefwolf(丢丢)的方法,如果还有好的方法可以在贴出来。
      

  5.   

    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去掉最后一个字符串
       }}
      

  6.   

    chiefwolf(丢丢)的不错... 比较规范,可读性也比较好