2016-09-20 3 views
0

たとえば、n = 7のバイナリオブジェクトがあり、k = 3が1と等しいとすると、35のすべての順列をRで3を選択するにはどうすればよいですか?例えば、1110000はそのような順列(残っている34を処理するための合理的な出発点)です。私は(ハードコードされた数字で)次のような何かを行うことによって、3つのループを入れ子にすることで、3を選択7のために特別に非再帰的なアルゴリズムを記述することができます。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の関数をどのように生成するかわからない。

私はこの種の問題を他の言語(たとえばhere、およびhere)で再帰的に解決する方法を見てきましたが、これらのアルゴリズムをRに変換するのに十分理解できません。再帰的解法は、問題を2つのカテゴリ、すなわち最初の要素が(n-1、k-1)の場合は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)  
関連する問題