美文网首页
3步实现从1到N的全排列——数据分析师不懂黑科技

3步实现从1到N的全排列——数据分析师不懂黑科技

作者: 一血老黄忠 | 来源:发表于2019-03-20 14:26 被阅读0次

一个有意思的事情,写个程序输出从1到N的全排列。我们知道数学公式有N!种排列。但是计算机程序如何数出来呢。
可以用递归的思想解决这个问题。递归要有递归公式和退出条件。

  • N=1
    排列:[1]
  • N=2
    排列:[12] [21]
  • N=3 : [123] [312] [213] [321] [132] [231]
    ...
  • 递归公式推导
    假设排列1:N为af(N),我们现在要导出af(N)和af(N-1)的关系(公式)。
    首先比较下af(3)和af(2)的差别,不难总结:
    af(3) = 交换顺序(af(2),3),取并集(将3插入到af(2)各种排列不同的位置)
    换成N,即:
    af(N)=swap(af(N-1),N) U (instert(af(N-1),N)
    递归退出条件就是N=1和2.
    具体实现,这里使用R语言实现。

实现交换函数

swapf <- function(x,y){
  # x, y vector
  list(c(x,y),c(y,x))
}
  • 执行实例
swapf(1,2)
[[1]]
[1] 1 2

[[2]]
[1] 2 1
swapf(1:2,3:4)
[[1]]
[1] 1 2 3 4

[[2]]
[1] 3 4 1 2

实现插入函数

insertf <- function(x,y){
  # x vector,and  y vector whith length one.
  len = length(x)
  if(len == 1) swapf(x,y) -> rt
  if(len >= 2){
    rt = list()
    for(i in 1:(len-1)){
      tmp = c(x[1:i],y,x[(i+1):len]);#print(tmp)
      rt <- c(rt, list(tmp))
  }
  }
  rt
}
  • 执行实例
insertf(1:3,5)
[[1]]
[1] 1 5 2 3

[[2]]
[1] 1 2 5 3
insertf(1:3,5:6)
[[1]]
[1] 1 5 6 2 3

[[2]]
[1] 1 2 5 6 3

实现递归公式

af<-function(n){
  if(n==1) return(list(1)) # 递归退出条件
  if(n==2) return(swapf(1,2)) # 递归退出条件
  lapply(af(n-1), swapf,n)  %>% unlist(recursive = F) %>% c(sapply(af(n-1),insertf,n))
}
  • 执行实例
af(1)
[[1]]
[1] 1

> af(2)
[[1]]
[1] 1 2

[[2]]
[1] 2 1

> af(3)
[[1]]
[1] 1 2 3

[[2]]
[1] 3 1 2

[[3]]
[1] 2 1 3

[[4]]
[1] 3 2 1

[[5]]
[1] 1 3 2

[[6]]
[1] 2 3 1

> af(4)
[[1]]
[1] 1 2 3 4

[[2]]
[1] 4 1 2 3

[[3]]
[1] 3 1 2 4

[[4]]
[1] 4 3 1 2

[[5]]
[1] 2 1 3 4

[[6]]
[1] 4 2 1 3

[[7]]
[1] 3 2 1 4

[[8]]
[1] 4 3 2 1

[[9]]
[1] 1 3 2 4

[[10]]
[1] 4 1 3 2

[[11]]
[1] 2 3 1 4

[[12]]
[1] 4 2 3 1

[[13]]
[1] 1 4 2 3

[[14]]
[1] 1 2 4 3

[[15]]
[1] 3 4 1 2

[[16]]
[1] 3 1 4 2

[[17]]
[1] 2 4 1 3

[[18]]
[1] 2 1 4 3

[[19]]
[1] 3 4 2 1

[[20]]
[1] 3 2 4 1

[[21]]
[1] 1 4 3 2

[[22]]
[1] 1 3 4 2

[[23]]
[1] 2 4 3 1

[[24]]
[1] 2 3 4 1

相关文章

  • 3步实现从1到N的全排列——数据分析师不懂黑科技

    一个有意思的事情,写个程序输出从1到N的全排列。我们知道数学公式有N!种排列。但是计算机程序如何数出来呢。可以用递...

  • 输出数组的全排列

    思想: n 个元素数组全排列 = 第 1 个前缀 + 后 n - 1 个元素全排列 输出第 k 个元素之后的全排列...

  • python实现leetcode之60. 排列序列

    解题思路 factorial[i]保存有1到i的排列的总数,最后一项factorial[-i]就是1到n全排列的总...

  • 子集、全排列、第k个排列

    子集输出 全排列输出 存在重复数字的全排列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大...

  • 线性代数笔记 (一)

    预备知识 全排列和对换 全排列 把 n 个不同的元素排成一列, 叫做这 n 个元素的全排列 (简称排列) .n 个...

  • 字符串全排列

    题目描述 对给定的n位字符串全排列 解题思路 n位的字符串的全排列,先确定第0位,然后对后面n-1位进行全排列,在...

  • 线性代数-行列式

    【义】1.3 由自然数1, 2, …, n组成的不重复的有确定次序的排列, 称为一个n级全排列( 简称为n级排列)...

  • Mysql on Linux——数据分析师不懂黑科技

    安装mysql 授权用户访问数据库 创建用户 授权成功! 测试访问 在未授权用户之前,一般用户无法访问,但是授权后...

  • Java实现全排列

    ①假设全排列函数为f(n)=n!,那么可以立刻知道f(n+1)=(n+1)Xn!=(n+1)*f(n),因此可以利...

  • 递归实现js数组全排列

    规律 当n = 1时, 数组arr = [A],全排列结果为 [A]; 当n = 2时, 数组arr = [A, ...

网友评论

      本文标题:3步实现从1到N的全排列——数据分析师不懂黑科技

      本文链接:https://www.haomeiwen.com/subject/hrmzmqtx.html