全排列的递归实现方法

对于全排列,比如有5个字符abcde,则有5!=120种方法.

创新互联公司是一家集网站建设,陕西企业网站建设,陕西品牌网站建设,网站定制,陕西网站建设报价,网络营销,网络优化,陕西网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

首先分析出数学递归公式,加上对abcde这个字符串中的字符做全排列。

那么,假设abcde是一个输入参数,输出的值则是一个全排列集合。我们就可以有:

f(abcde)=a+f(bcde) //注意,此处的+号不是简单的加号,而是另一个运算规则,下面会说到。

f(bcde)=b+f(cde)

f(cde)=c+f(de)

f(de)={de,ed}

以上就是运算的递归函数,其中f()函数返回的是一集合,而这里的加号,笔者把它的行为定义为,把一个字符按顺序的插入到一个字符串中。

举个例子:

a+bcde,行为就是把a插在每个位置之间,得到的是如下的一个集合:

abcde,bacde,bcade,bcdae,bcdea

上面是a对单个项进行+操作。

a+f(bcde)则意思是a对一个集合f(bcde)做操作,意味着a对集合中每一个象做+操作。

如上的例子,a对bcde做操作会生成5个项的集合,那么事实上bcde的全排列,根据中学的数学计算推断有4!就是24,f(bcde)有24个项。所以a+f(bcde)意味着a对于这24个项中的每一个项做操作,每个操作生成5个项的,因此总的就会生成5*24=120个项的集合。说到这,你就应该理解+操作的定义了。

事实上,写成+操作只是为了看起来方便,也可以换种表的方式,比如叫做C操作,那么,上述递归的式子也可以写成,

f(abcde)=C(a,f(bcde) )

f(bcde)=C(b,f(cde))

f(cde)=C(c,f(de))

f(de)={de,ed}

这两种表达的数学含义都是一样的。

 

有了数学意义的表达式,就可以写代码了

c#实现。

 

  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Text;  
  5.  
  6. namespace quanpailie   
  7. {   
  8.     class Program   
  9.     {   
  10.         static List alllist = new List();   
  11.         static void Main(string[] args)   
  12.         {   
  13.             alllist = f("abcd");   
  14.             foreach (var i in alllist)   
  15.             {   
  16.                 Console.WriteLine(i);   
  17.             }   
  18.         }  
  19.  
  20.         static List f(string instring)//递归方法的实现  
  21.         {   
  22.             if (instring.Length == 2)//只有当只剩下2个字符的时候,可以返回出结果。  
  23.             {   
  24.                 List tmplist = new List();   
  25.                 tmplist.Add(instring[0].ToString() + instring[1].ToString());   
  26.                 tmplist.Add(instring[1].ToString() + instring[0].ToString());   
  27.                 return tmplist;   
  28.             }   
  29.             else   
  30.             {   
  31.                 //对于大于2个字符的,只能用+操作来分割计算,也就是combine操作的实现方法分割来计算。  
  32.                 return combine(instring[0].ToString(), f(instring.Remove(0, 1)));//把instring的第一个字符分离出来,和后续的字符的全排列做combine操作。返回的是一个集合。  
  33.             }   
  34.         }  
  35.  
  36.         static List combine(string c, List lists)//此处就是上述所说的+操作的实现方法,或者说C操作的实现方法,返回的是一个集合  
  37.         {   
  38.             List output = new List();   
  39.             foreach (string s in lists)   
  40.             {   
  41.                 for (int i = 0; i <= s.Length; i++)//c插入到s中的每个位置  
  42.                 {   
  43.                     string tmps = "";   
  44.                     tmps = s.Insert(i, c);   
  45.                     output.Add(tmps);   
  46.                 }   
  47.             }   
  48.             return output;   
  49.         }   
  50.     }   
  51. }  

 


网页标题:全排列的递归实现方法
网站地址:http://myzitong.com/article/jcicdh.html