Javaは再帰で全配列を実現し、詳細

1892 ワード

package edu.cqu.algorithmTest;
import java.util.Scanner;
//全配列、再帰的にpublic class Main 8{public static void main(String[]args){int[]arr={1,2,3};bfs(arr,0,arr.length-1);}
public static void bfs(int []a,int start,int end) {
    /*
     *       ,    start                :
     *       ,    ,start+1
     *        ,     ,start    1,       start        
     *   start      ,           ,       。           。
     *     (   start    ),       start   i  1 。
     *    {1,2,3}   
     *        {2,3}     ,
     *        ,start  {1},       {1}  {2,3}    。i     2,3 
     *
     *
     * */
    if(start == a.length) {
        for(int i:a) {
            System.out.print(i);
        }
        System.out.println();
         
    }
     
    for(int i = start;i < a.length;i++) {
        if(isUnique(a,start,i)) {
            swap(a,start,i);
            bfs(a,start+1,i);
            /*
             *         ?
             *      {1,2,3},   {1}   {2,3}   {2},      ,
             *     {2} {1,3}  2,1,3 2,3,1 
             *   ,    {1}  {2,3}  3 ,    [2,1,3][2,3,1]                   
             *   ,      。     ,        ,    start,i        ,        
             *         。      ,     。
             *
             *
             * */
            swap(a,start,i);
        }
         
    }
}
 
static boolean isUnique(int a[],int start,int end ) {
    /*
     * //          a[end]           ,  {1}     {2,3,4}  4    ,
     *           {2,3,1}    ,      {2,3,1}    
     *     {1}   {4,3,4}      4         ,   {1}    4  ,   {1,3,4}    
     *        。
     *   ,      a[end]      ,          
     *
     *
     * */
    for(int i = start ;i < end; i++) {
        if(a[i] == a[end]) {
            return false;
        }
    }
    return true;
}

 
 
 
public static void swap(int []a,int m,int n) {
    int t = a[m];
    a[m] = a[n];
    a[n] = t;
}

}