生成全排列算法(Scala和C++实现)

全排列问题描述为:给定一串数字,生成所有可能的排列。
本文给出两类,一种使用C++通过回溯算法,一种使用Scala通过递归来求解。

首先介绍使用Scala通过递归求解的方法,定义递归关系:对S中的每个x,递归的生成S-x的所有排列的序列,而后将x加到每个序列的前面。这样就能对S里的每个x,产生出了S的所有以x开头的排列。合起来就是所有的排列了。
实现的代码如下:

def permutation(xs: List[Int]): Set[List[Int]] =
  if (xs == Nil) Set(Nil)
  else {
    for {
      i <- xs.indices
      ys <- func(xs filter (_ != xs(i)))
    }   yield xs(i) :: ys
  }.toSet

func(List(1, 2, 3))

使用回溯法的代码如下:

void permutation(vector<int> vec, int s) {
    if (s == vec.size()) {
        for_each(vec.begin(), vec.end(), [](int v) { cout << v << " "; });
        cout << endl;
    }

    for (int i = s; i < vec.size(); i++) {
        swap(vec[s], vec[i]);
        func(vec, s+1);
        swap(vec[s], vec[i]);
    }
}

其中,函数参数s表示的是当前序列已经有多少位完成了排列,即前s位完成了排列,当前正在对第s位进行排列。取所有ssize - 1位置的元素作为第s位的数字。回溯的意义是在执行完递归func(vec, s+1);后,需要将之前交换过的元素交换回来,即需要将数组回复原状。

综上,觉得使用Scala的递归思想考虑还是比较简单的,但效率不敢恭维。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,700评论 0 89
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,937评论 0 160
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,159评论 19 139
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 18,235评论 2 36
  • 文/苏门映雪 -1- 周末我带女儿去服装店,碰见一个妈妈带着自己的孩子正在试穿衣服。那是个十岁左右的小姑娘,她们母...
    苏门映雪阅读 4,903评论 9 18

友情链接更多精彩内容