2016-09-20 55 views
0

如果我有,比如說n = 7個二元對象,並且說k = 3個等於1,那我怎樣枚舉所有35個排列中的7個在R中選擇3?例如,1110000就是這樣的一個排列(並且通過剩下的34個工作是一個合理的起點)。我可以通過做這樣的事情築巢三個環路寫非遞歸算法,專門爲7選3以下(通過硬編碼數):如何枚舉R中k = 1的n個二元對象的所有排序?

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標記...我會高興來改善這個問題,如果你有反饋給我)。

+2

'combinat :: combn(7,3)'如何將返回的數字作爲1的索引? – Gregor

+0

@Gregor謝謝你......我明白這是如何工作的,而且*將*爲我提供解決這個問題的動機所在的更大問題的解決方案。 :)那就是說,有什麼機會可以幫助我理解創建一個遞歸函數來解決問題嗎? – Alexis

+1

遞歸解決方案聽起來很有趣 - 我現在沒有時間回答,但我希望今晚晚些時候能找到時間。 – Gregor

回答

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)