我最近发布了一个关于如何使用递归来估计C ++中所有下三角组合的问题。我设法找到一个递归算法,给出一个大小为n的数组,生成并打印数组中r元素的所有可能组合。我在R中使用Rcpp使用了这个函数。然后我在这个函数周围写了一个循环,得到组合r到r + n的所有子集。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int recursive(IntegerVector arr, IntegerVector data, int start, int end, int index, int r)
{
if (index == r)
{
for (int j=0; j<r; j++)
printf("%d ", data[j]);
printf("\n");
}
for (int i=start; i<=end && end-i+1 >= r-index; i++)
{
data[index] = arr[i];
recursive(arr, data, i+1, end, index+1, r);
}
}
有五组的R代码:
Rcpp::sourceCpp('recursive2.cpp')
nComm <- 5
r <- c(2:nComm)
n <- nComm
arr <- c(1:nComm)
dat <- c(1:nComm)
for(i in 1:(n-1)){
recursive(arr, dat, 0, n-1, 0, r[i])
}
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
1 2 3 4
1 2 3 5
1 2 4 5
1 3 4 5
2 3 4 5
1 2 3 4 5
目前,这只是打印我需要的组合子集来估计我的差异。我希望能够删除循环并将其用作单个Rcpp函数/脚本。最终目标是能够使用子集(当前打印的组合)作为数组中子行的子集。这将用于计算向量之间的相交。因此,1 2
将用于比较数组中的行1
和2
。等等。