全排列的递归实现方法

简介:

对于全排列,比如有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<string> alllist = new List<string>();   
  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<string> f(string instring)//递归方法的实现   
  21.         {   
  22.             if (instring.Length == 2)//只有当只剩下2个字符的时候,可以返回出结果。   
  23.             {   
  24.                 List<string> tmplist = new List<string>();   
  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<string> combine(string c, List<string> lists)//此处就是上述所说的+操作的实现方法,或者说C操作的实现方法,返回的是一个集合   
  37.         {   
  38.             List<string> output = new List<string>();   
  39.             foreach (string s in lists)   
  40.             {   
  41.                 for (int i = 0; i &lt;= 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. }  

 











本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/832060 ,如需转载请自行联系原作者




相关文章
|
3月前
|
人工智能 Linux API
OpenClaw+本地模型无限Token实战:阿里云/本地部署+Ollama+百炼API配置指南
OpenClaw 配合本地小模型,可实现**完全免费、无限Token、数据不出本地、断网可用**的私人AI助手,彻底告别订阅费、额度限制与隐私泄露风险。本文完整覆盖:OpenClaw 2026阿里云/Windows11/MacOS/Linux全平台部署、Ollama快速搭建本地模型、阿里云百炼Coding Plan免费大模型配置、本地+云端双模型自动切换方案,所有命令可直接复制,全程无付费环节、无冗余表述,适合追求低成本、高隐私、高自由度的个人与轻量化团队。
1940 15
|
编解码 JavaScript iOS开发
如何生成HLS协议的M3U8文件
什么是HLS协议:   HLS(Http Live Streaming)是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。
4562 0
|
10月前
|
传感器 人工智能 自然语言处理
魔搭社区模型速递(7.26-8.2)
🙋魔搭ModelScope本期社区进展:1498个模型,130个数据集,85个创新应用, 7 篇内容
1004 0
|
7月前
|
运维 监控 Java
分布式事务新方案:Saga 与 TCC 在 Java 生态的融合实践
本文深入探讨Saga与TCC两种分布式事务模式在Java生态中的原理、实现及融合实践,结合Seata等框架,分析其在微服务架构下的应用策略、性能优化与监控运维,助力构建高效稳定的分布式事务解决方案。
921 1
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
815 3
|
缓存 监控 关系型数据库
关于NAS你必须知道的坑
小小的备份为何老是将数据库主机打挂
1587 0
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。
|
存储 监控 Unix
Linux 中监控磁盘分区使用情况的 10 个工具
Linux 中监控磁盘分区使用情况的 10 个工具
|
存储 人工智能 自然语言处理
机器学习系列 | 04: 知识图谱发展历程及其分类
本文简要梳理知识图谱的前世今生及其分类
|
机器学习/深度学习 自然语言处理 数据可视化
专业的知识图谱应用门槛正在被不断降低
专业的知识图谱应用门槛正在被不断降低
2900 3
专业的知识图谱应用门槛正在被不断降低

热门文章

最新文章