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

How to enumerate all orderings of n binary objects where k = 1 in R?

如果我有 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 生成函数。 (这里的输出格式相当随意,顺便说一句。)

我在其他语言中看到过一些针对此类问题的递归解决方案(例如,here, and here),但我的递归确实很差,并且无法理解它们以翻译这些算法到 R。我知道递归解决方案想将问题分解为两类之一:第一个元素为 1 的 (n-1,k-1),以及第一个元素为 0 的 (n -1,k),但我迷失了如何实施(我希望这个问题有一个 newb 标签......我会 高兴 来改进这个问题如果你有反馈给我)。

这里是用 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)