如何枚举R中k = 1的n个二进制对象的所有排序?

时间:2016-09-20 20:53:15

标签: r recursion combinatorics

如果我有n =七个二进制对象,并说k =其中三个等于一个,我怎么能枚举R中7个选择3的所有35个排列?例如,1110000就是这样一种排列(并且是合理的起点,通过其余的34)。我可以通过执行类似下面的操作(使用硬编码的数字)嵌套三个循环来专门为7选3写一个非递归算法:

n2Ck <- function() {
    output <- NULL
    out <- as.numeric(c(rep(1,times=3),rep(0, times=4)))
    for (i in 1:5) {
        for (j in (i+1):6) {
            for (k in (j+1):7) {
                out <- out*0
                out[c(i,j,k)] <- 1
                output <- rbind(output,out)
                }
            }
        }
    return(output)
    }

产生:

nC2k()
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
out    1    1    1    0    0    0    0
out    1    1    0    1    0    0    0
out    1    1    0    0    1    0    0
out    1    1    0    0    0    1    0
out    1    1    0    0    0    0    1
out    1    0    1    1    0    0    0
out    1    0    1    0    1    0    0
out    1    0    1    0    0    1    0
out    1    0    1    0    0    0    1
out    1    0    0    1    1    0    0
out    1    0    0    1    0    1    0
out    1    0    0    1    0    0    1
out    1    0    0    0    1    1    0
out    1    0    0    0    1    0    1
out    1    0    0    0    0    1    1
out    0    1    1    1    0    0    0
out    0    1    1    0    1    0    0
out    0    1    1    0    0    1    0
out    0    1    1    0    0    0    1
out    0    1    0    1    1    0    0
out    0    1    0    1    0    1    0
out    0    1    0    1    0    0    1
out    0    1    0    0    1    1    0
out    0    1    0    0    1    0    1
out    0    1    0    0    0    1    1
out    0    0    1    1    1    0    0
out    0    0    1    1    0    1    0
out    0    0    1    1    0    0    1
out    0    0    1    0    1    1    0
out    0    0    1    0    1    0    1
out    0    0    1    0    0    1    1
out    0    0    0    1    1    1    0
out    0    0    0    1    1    0    1
out    0    0    0    1    0    1    1
out    0    0    0    0    1    1    1

但我不知道如何为任意n和k产生函数。 (这里的输出格式相当随意,顺便说一句。)

我在其他语言中已经看到了这种问题的一些递归解决方案(例如,herehere),但我在递归方面很差,并且无法理解它们足以将这些算法转换为R.我理解递归解决方案想要将问题分解为两个类别之一:第一个元素为1(n-1,k-1),第一个元素为第一个元素对于(n-1,k)是0,但是我对如何实现感到迷茫(我希望这个问题有一个newb标签...我会很高兴来改进这个问题,如果你对我有反馈意见。)

1 个答案:

答案 0 :(得分:1)

这里是用于解决R中问题的示例代码。selected向量用于存储选定的对象索引。

# your code goes here
n <- 9
k <- 5
count <- 0
selected <- vector( 'numeric' , k )

rec <- function(x,y) {
    if (y == 0){
        print (selected)
    }
    else if( x <= n ){
        for( i in x:(n-y+1) ){
            selected[k-y+1] <<- i
            rec( i+1, y-1 )
        }
    }
}

rec(1,k)