全排列的递归实现方法-创新互联

对于全排列,比如有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
  2. using
  3. using
  4. using
  5. namespace
  6. class
  7. staticstringnewstring
  8. staticvoidstring
  9. "abcd"
  10. foreachin
  11. staticstringstring//递归方法的实现 
  12. if//只有当只剩下2个字符的时候,可以返回出结果。 
  13. stringnewstring
  14. return
  15. else
  16. //对于大于2个字符的,只能用+操作来分割计算,也就是combine操作的实现方法分割来计算。 
  17. return//把instring的第一个字符分离出来,和后续的字符的全排列做combine操作。返回的是一个集合。 
  18. staticstringstringstring//此处就是上述所说的+操作的实现方法,或者说C操作的实现方法,返回的是一个集合 
  19. stringnewstring
  20. foreachstringin
  21. forint//c插入到s中的每个位置 
  22. string""
  23. return

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:全排列的递归实现方法-创新互联
网页地址:http://abwzjs.com/article/digidd.html