求一个集合S中m个元素的所有排列以及一个数组A的全排列—递归实现版完整代码
说明,本文全文代码均用dart语言实现。
求一个集合S中m个元素的所有排列情况,并打印,非常适合用递归的思路实现。本文给出了两种实现方法,一种是给定的填充排列数组长度是固定的,一种是可变长度的。两种方法主要思路是一样的,只是实现细节上略有差异。具体代码如下:
void permute<E>(Set<E> s, int m) {
if (m < 0 || m > s.length) throw StateError('m is not in [0, ${s.length}]');
_fill(<E>[], s, m);
print('-------------------');
_fillFixed(List<E>(m), s, 0, m);
}
void _fill<E>(List<E> pm, Set<E> s, int m) {
if (pm.length < m) {
for (var e in s) {
pm.add(e);
_fill(pm, _rest(s, e), m);
}
} else {
print(pm);
}
if (pm.isNotEmpty) pm.removeLast();
}
void _fillFixed<E>(List<E> pm, Set<E> s, int i, int m) {
if (i < m) {
for (var e in s) {
pm[i] = e;
_fillFixed(pm, _rest(s, e), i + 1, m);
}
} else {
print(pm);
}
}
Set _rest<E>(Set<E> s, E e) {
var t = s.toSet();
t.remove(e);
return t;
}
如果求一个集合的全排列,如果是集合的话,其实在上面的函数permute,将m的值设为集合s的长度即可:
void permuteAll2<E>(Set<E> s) => permute(s, s.length);
如果求一个数组的全排列情况(假设数组中元素不重合),可以不像集合那样,还需要额外申请空间,直接利用数组本身即可完成:
void permuteAll(List a, int k) {
if (k < a.length - 1) {
for (int i = k; i < a.length; i++) {
if (i != k) _swap(a, k, i);
permuteAll(a, k + 1);
if (i != k) _swap(a, k, i);
}
} else {
print(a);
}
}
void _swap(List a, int i, int j) {
var t = a[i];
a[i] = a[j];
a[j] = t;
}
具体思路,比较简单,直接查看代码即可,或者参照网上的讲解,这里不再赘述了。有兴趣的也可以直接debug,可以看每一步的操作。
最后,验证代码如下:
void main() {
var s = {1, 2, 3};
permute(s, 3);
print('---------------------\n');
permuteAll(s.toList(), 0);
print('---------------------\n');
permuteAll2(s);
}
求一个集合S中m个元素的所有排列以及一个数组A的全排列—递归实现版完整代码的更多相关文章
- 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况
求一个集合S的m个元素组合的所有情况,并打印出来,非常适合采用递归的思路进行求解.因为集合的公式,本身就是递归推导的: C(n,m) = C(n-1,m-1) + C(n-1,m). 根据该公式,每次 ...
- parents([expr]) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。
parents([expr]) 概述 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选.大理石平台检定规程 参数 exprStringV1.0 用于 ...
- 转<<C#集合Dictionary中按值的降序排列
转载地址:http://blog.sina.com.cn/s/blog_5c5bc9070100pped.html C#集合Dictionary中按值的降序排列 static void Main(st ...
- 集合求交集 & 去除列表中重复的元素
集合求交集: set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 交集:set3 = set1 & set2 print(ste3) #结果为{4,5} 或者ste1. ...
- oracle 中从一个历史表中查询最新日期数据插入到另一个表中语句
先从历史表中查询最新的一个语句: select t.id from ( select r.*, row_number() over(partition by r.分组字段 order by r.排序时 ...
- java消除整型数组中重复的元素,排序后输出新数组
法一: import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(S ...
- 如何去除List集合中的重复元素?
一.问题由来 在实际开发的时候,我们经常会碰到这么一个问题:一个集合容器里面有很多重复的对象,里面的对象没有主键,或者说忽略主键,根据业务的需求,我们需要根据条件筛选出没有重复的对象. 二.去重操作 ...
- web.xml文件中的web-app元素 部署
[转载]web.xml文件中的web-app元素 (2012-05-24 13:35:57) 转载▼ 标签: 转载 分类: java 挺全 的 呵呵呵 转了 原文地址:web.xml文件中的web-a ...
- Ex 2_23 如果一个数组超过半数的元素都相同时,该数组被称为含有一个主元素..._第二次作业
将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是 ...
随机推荐
- linux vps定时备份网站、数据库命令sh
vps定时备份数据库命令,将下面的代码保存为backsql.sh,然后设置定时任务运行即可. cd /home/admin/backup #切换到备份目录 btimes=$(date +%y%m%d% ...
- squid之------ACL控制
一.ACL概念 Squid提供了强大的代理控制机制,通过合理设置ACL(Access Control List,访问控制列表)并进行限制,可以针对源地址.目标地址.访问的URL路径.访问的时间等各 ...
- chrome获取页面element的xPath
chrome真的是强大的工具 1.在chrome打开的页面点击F12,进入开发者模式 2.点击弹出的开发者工具左上角的跟踪箭头,再点击需要跟踪的页面元素,html程序定位到元素在程序中位置 3.选中的 ...
- centos6.5搭建zabbix3.4
centos6.5搭建zabbix3.4 参考资料:https://blog.csdn.net/qq_36331560/article/details/80517282 客户端: https://bl ...
- spark性能调优点(逐步完善)
1.使用高性能序列化类库2.优化数据结构3.对多次使用的RDD进行持久化/CheckPoint4.使用序列化的持久化级别5.Java虚拟机垃圾回收调优 降低RDD缓存占用空间的比例:new Spark ...
- 6424. 【NOIP2019模拟2019.11.13】我的订书机之恋
题目描述 Description Input Output Sample Input 见下载 Sample Output 见下载 Data Constraint 题解 lj题卡线段树 求出每个右端点往 ...
- Selenium 详解CSS定位
xpath定位是“屠龙刀”,那CSS定位就是"倚天剑了",相对xpath来说,具有语法简单,定位速度快等优点 一.属性定位 1.可以通过元素的id,class,tag标签这三个属性 ...
- Oracle 字符串拼接会出现0自动忽略,解决方案
解决方案 ,),'||num,num) from table_name 参考:https://blog.csdn.net/menghuannvxia/article/details/73089903
- maven 私服的setting.xml配置
<?xml version="1.0" encoding="UTF-8"?> 2 <settings xmlns="http://m ...
- #学号 20175201张驰 《Java程序设计》第10周课下作业MyList
参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 public class MyList { public static void main(String [] ...