我想生成n! R中给定n的排列

时间:2010-07-05 06:13:43

标签: r permutation

假设n = 3 然后输出应该是:包含向量的向量: 123 213 132 231 321

6 个答案:

答案 0 :(得分:6)

这将解决您的问题:

install.packages("combinat")
require(combinat)
permn(1:3)

还有以下功能:choose,combn,expand.grid 可能证明将来对你有用。

答案 1 :(得分:6)

library(gtools)
permutations(3,3)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    3    2
[3,]    2    1    3
[4,]    2    3    1
[5,]    3    1    2
[6,]    3    2    1

答案 2 :(得分:1)

gregmisc包应该具有permutations()功能。

permutations3,3)

答案 3 :(得分:0)

这里有一些非递归代码:

maxdepth <- 4
curdepth <- 1
l <- list()
i <- 0
while (i < maxdepth) {
    l <- c(l, 1)
    i <- i+1
}
done <- 0
results <- list()
resct <- 1

print(paste(sep=",",l))

while (curdepth > 0) {
    if (curdepth == maxdepth) {
        results[[resct]] <- l
        resct <- resct+1
        l[[curdepth]] <- l[[curdepth]]+1
    }
    if (l[[curdepth]] == maxdepth+1) {
        while (!done && l[[curdepth]] == maxdepth+1) {
            l[[curdepth]] <- 1
            curdepth <- curdepth-1
            if (curdepth == 0) {
                done <- 1
            }
        }
        if (!done) {
            l[[curdepth]] <- l[[curdepth]]+1
        }
    } else if (curdepth < maxdepth) {
        curdepth <- curdepth+1
    }
}

编辑:对输出向量而不是打印;完成后,“结果”应包含所需的答案

答案 4 :(得分:0)

我不知道是不是这样,但我会试一试 如果你想做一些具有更长时间矢量的大量排列的东西,它的要求要低得多,并且使用蒙特卡罗并且只需用大量随机排列(可能在R中生成)对空间进行采样。具有sample功能)。

答案 5 :(得分:0)

前段时间我不得不在基础R中执行此操作而不加载任何包:

permutations <- function(n){
    if(n==1){
        return(matrix(1))
    } else {
        sp <- permutations(n-1)
        p <- nrow(sp)
        A <- matrix(nrow=n*p,ncol=n)
        for(i in 1:n){
            A[(i-1)*p+1:p,] <- cbind(i,sp+(sp>=i))
        }
        return(A)
    }
}

示例:

> permutations(3)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    3    2
[3,]    2    1    3
[4,]    2    3    1
[5,]    3    1    2
[6,]    3    2    1