全排列 递归方法的步骤分析

定义
排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;
全排列:当n==m时,称为全排列;

 全排列 递归方法的步骤分析_第1张图片
Main class
 static void Main(string[] args)
        {
            List mylist = new List { "1", "2", "3"  };
            Combination.Permutation(mylist,0,2);          
            Console.ReadLine();              
        }
Permutation class
   /// 
        /// 对数组进行全排列
        /// 
        /// 要进行全排列的数组
        /// 进行全排列的开始下标
        /// 进行全排列的结束下标
        /// can't have duplicate number
        /* Permutation(lsArray{1,2,3} ,0,2} begin=0. 最外层的begin 不会变的
         *    i=0 end=2 ; exec swap({1,2,3},begin=0,i=0) =>lsArray{1,2,3} ;Permutation(lsArray{1,2,3}, 1, 2);  
         *           i=1  exec swap({1,2,3},begin=1,i=1) =>lsArray{1,2,3} ;Permutation(lsArray{1,2,3}, 2, 2); 
         *                                                          i=2 print {1,2,3}  return last level                                              
         *                exec swap({1,2,3},begin=1,i=1)   还原回去 {1,2,3}
         *           i=2  exec swap({1,2,3},begin=1,i=2) =>lsArray{1,3,2} ;Permutation(lsArray{1,3,2}, 2, 2);     
         *                                                          i=2 print {1,3,2}  return last level   
         *                exec swap({1,3,2},begin=1,i=2)   还原回去 {1,2,3} 
         *           i=3  i<=end   break out    
         *    i=1 end=2 ; exec swap({1,2,3},begin=0,i=1) =>lsArray{2,1,3} ;Permutation(lsArray{2,1,3}, 1, 2);           
         *           i=1  exec swap({2,1,3},begin=1,i=1) =>lsArray{2,1,3} ;Permutation(lsArray{2,1,3}, 2, 2);     
         *                                                          i=2 print {2,1,3}  return last level 
         *                exec swap({2,1,3},begin=1,i=1)   还原回去 {2,1,3}
         *           i=2  exec swap({2,1,3},begin=1,i=2) =>lsArray{2,3,1} ; Permutation(lsArray{2,3,1}, 2, 2);  
         *                                                          i=2 print {2,3,1}  return last level 
         *                exec swap({2,3,1},begin=1,i=2)   还原回去 {2,1,3}
         *           i=3  i<=end   break out   
         *    i=2 end=2 ; exec swap({2,1,3},begin=0,i=2) =>lsArray{3,1,2} ;Permutation(lsArray{3,1,2}, 1, 2);       
         *           i=1  exec swap({3,1,2},begin=1,i=1) =>lsArray{3,1,2} ;Permutation(lsArray{3,1,2}, 2, 2);                                                
         *                                                          i=2 print {3,1,2}  return last level 
         *                exec swap({3,1,2},begin=1,i=1)   还原回去 {3,1,2}                                        
         *           i=2  exec swap({3,1,2},begin=1,i=2) =>lsArray{3,2,1} ; Permutation(lsArray{3,2,1}, 2, 2);  
         *                                                          i=2 print {3,2,1}  return last level
         *                exec swap({3,2,1},begin=1,i=1)   还原回去 {3,1,2}                                            
         *            i=3  i<=end   break out                                                 
         *                                                          
         *                                                          
        */

        public static void Permutation(List lsArray, int begin, int end)
        {
            if (begin == end)
            {
                for (int i = 0; i <= end; i++)
                    Console.Write(" {0} ", lsArray[i]);
                Console.WriteLine();
            }

            for (int i = begin; i <= end; i++)
            {
                Swap(lsArray, begin, i);//for循环将每个数放到begin位置中去  
                Permutation(lsArray, begin + 1, end);//假设begin位置确定,那么对begin+1 到end中的数继续递归,其实重复上一步,为了把数据能够依次替换放入begin的位置
                Swap(lsArray, begin, i);      //换过去后再还原
            }
        }


        /// 
        /// 交换数组中的下标为x,y的值
        /// 
        /// 该数组
        /// 
        /// 
        private static void Swap(List lsArray, int x, int y)
        {
            string t = lsArray[x];
            lsArray[x] = lsArray[y];
            lsArray[y] = t;
        }

总结:
1如果是有重复的元素,无法剔除。
2 迭代比较难懂,自己写不出来。



你可能感兴趣的:(C#)