Как создать матрицу из всех 2 ^ n двоичных последовательностей длины n, используя рекурсию в R? - PullRequest
0 голосов
/ 15 октября 2019

Я знаю, что могу использовать для этого файл расширения. Но я пытаюсь выучить реальное программирование. Моя цель - взять то, что у меня есть ниже, и использовать рекурсию, чтобы получить все 2 ^ n двоичных последовательностей длины n.

Я могу сделать это для n = 1, но я не понимаю, как бы я использовалта же функция рекурсивным способом, чтобы получить ответ для более высоких измерений.

Вот для n = 1:

binseq <- function(n){
  binmat <- matrix(nrow = 2^n, ncol = n)
  r <- 0 #row counter
  for (i in 0:1) {
        r <- r + 1
        binmat[r,] <- i
    }
  return(binmat)
  }

Я знаю, что я должен использовать, вероятно, cbind в операторе возврата,Моя интуиция говорит, что оператор return должен быть чем-то вроде cbind (binseq (n-1), binseq (n)). Но, честно говоря, я полностью потерян в этой точке.

Требуемый вывод должен в основном рекурсивно производить это для n = 3:


binmat <- matrix(nrow = 8, ncol = 3)
r <- 0 # current row of binmat
for (i in 0:1) {   
for (j in 0:1) {
for (k in 0:1) {
r <- r + 1
binmat[r,] <- c(i, j, k)}   
} 
}
binmat

Это должна быть просто матрица, как binmatзаполняется рекурсивно.

1 Ответ

0 голосов
/ 15 октября 2019

Я быстро написал эту функцию для генерации всех N ^ K перестановок длины K для заданных N символов. Надеюсь, это будет полезно.

gen_perm <- function(str=c(""), lst=5, levels = c("0", "1", "2")){
  if (nchar(str) == lst){
    cat(str, "\n")
    return(invisible(NULL))
  }
  for (i in levels){
    gen_perm(str = paste0(str,i), lst=lst, levels=levels)
  }
}

# sample call
gen_perm(lst = 3, levels = c("x", "T", "a"))

Я вернусь к вашей проблеме, когда у меня будет больше времени.

ОБНОВЛЕНИЕ Я изменил приведенный выше код, чтобы он работал для вашей проблемы. Обратите внимание, что заполняемая матрица живет в глобальной среде. Функция также использует переменную tmp для передачи строк в глобальную среду. Для меня это был самый простой способ решить проблему. Возможно, есть и другие способы.

levels <- c(0,1)
nc <- 3

m <- matrix(numeric(0), ncol = nc)

gen_perm <- function(row=numeric(), lst=nc, levels = levels){
  if (length(row) == lst){
    assign("tmp", row, .GlobalEnv)
    with(.GlobalEnv, {m <- rbind(m, tmp); rownames(m) <- NULL})
    return(invisible(NULL))
  }
  for (i in levels){
    gen_perm(row=c(row,i), lst=lst, levels=levels)
  }
}

gen_perm(lst=nc, levels=levels)

ОБНОВЛЕНИЕ 2 Чтобы получить ожидаемый результат, который вы указали, запустите

m <- matrix(numeric(0), ncol = 3)
gen_perm(lst = 3, levels = c(0,1))
m

levels, чтобы указать диапазон значенийгенерировать (двоичный в нашем случае) генерировать перестановки, m - пустая матрица для заполнения, gen_perm генерирует строки и добавляет их в матрицу m, lst - длина перестановки (соответствуетколичество столбцов в матрице).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...