如果我有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和here),但我在递归方面很差,并且无法理解它们足以将这些算法转换为R.我理解递归解决方案想要将问题分解为两个类别之一:第一个元素为1(n-1,k-1),第一个元素为第一个元素对于(n-1,k)是0,但是我对如何实现感到迷茫(我希望这个问题有一个newb
标签...我会很高兴来改进这个问题,如果你对我有反馈意见。)
答案 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)