# @param input 一個list, 每個list element 都是一個vector
# @return list 列出input[[1]], input[[2]], ..., input[[n]] 中所有可能的組合
# ex: list(c(input[[1]][1], input[[2]][1], ..., input[[n]][1]),
# ...
# c(input[[1]][length(input[[1]])], ..., input[[n]][length(input[[n]])])
combination <- function(input) {
if (length(input) == 1) {
return(lapply(input[[1]], function(a) a))
}
n <- length(input)
temp <- combination(input[1:(n-1)])
retval <- rep(temp, length(input[[n]]))
index <- 1
for(i in 1:length(input[[n]])) {
for(j in 1:length(temp)) {
retval[[index]] <- c(retval[[index]], input[[n]][i])
index <- index + 1
}
}
return(retval)
}
combination(list(1:3,4:6,7:8))
IyBAcGFyYW0gaW5wdXQg5LiA5YCLbGlzdCwg5q+P5YCLbGlzdCBlbGVtZW50IOmDveaYr+S4gOWAi3ZlY3RvcgojIEByZXR1cm4gbGlzdCDliJflh7ppbnB1dFtbMV1dLCBpbnB1dFtbMl1dLCAuLi4sIGlucHV0W1tuXV0g5Lit5omA5pyJ5Y+v6IO955qE57WE5ZCICiMgICAgICAgICAgICAgIGV4OiBsaXN0KGMoaW5wdXRbWzFdXVsxXSwgaW5wdXRbWzJdXVsxXSwgLi4uLCBpbnB1dFtbbl1dWzFdKSwKIyAgICAgICAgICAgICAgICAgICAgICAgLi4uCiMgICAgICAgICAgICAgICAgICAgICAgIGMoaW5wdXRbWzFdXVtsZW5ndGgoaW5wdXRbWzFdXSldLCAuLi4sIGlucHV0W1tuXV1bbGVuZ3RoKGlucHV0W1tuXV0pXSkKY29tYmluYXRpb24gPC0gZnVuY3Rpb24oaW5wdXQpIHsKICBpZiAobGVuZ3RoKGlucHV0KSA9PSAxKSB7CiAgICByZXR1cm4obGFwcGx5KGlucHV0W1sxXV0sIGZ1bmN0aW9uKGEpIGEpKQogIH0KICBuIDwtIGxlbmd0aChpbnB1dCkKICB0ZW1wIDwtIGNvbWJpbmF0aW9uKGlucHV0WzE6KG4tMSldKQogIHJldHZhbCA8LSByZXAodGVtcCwgbGVuZ3RoKGlucHV0W1tuXV0pKQogIGluZGV4IDwtIDEKICBmb3IoaSBpbiAxOmxlbmd0aChpbnB1dFtbbl1dKSkgewogICAgZm9yKGogaW4gMTpsZW5ndGgodGVtcCkpIHsKICAgICAgcmV0dmFsW1tpbmRleF1dIDwtIGMocmV0dmFsW1tpbmRleF1dLCBpbnB1dFtbbl1dW2ldKQogICAgICBpbmRleCA8LSBpbmRleCArIDEKICAgIH0KICB9CiAgcmV0dXJuKHJldHZhbCkKfQoKY29tYmluYXRpb24obGlzdCgxOjMsNDo2LDc6OCkp