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

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

 
Main class
 static void Main(string[] args)
        {
            List<String> mylist = new List<string> { "1", "2", "3"  };
            Combination.Permutation(mylist,0,2);          
            Console.ReadLine();              
        }
Permutation class
   /// <summary>
        /// 对数组进行全排列
        /// </summary>
        /// <param name="lsArray">要进行全排列的数组</param>
        /// <param name="begin">进行全排列的开始下标</param>
        /// <param name="end">进行全排列的结束下标</param>
        /// 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<string> 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);      //换过去后再还原
            }
        }


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

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



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值