r中的递归循环

时间:2015-08-01 18:57:31

标签: r

我是R的新手,但是我希望以递归的方式循环遍历给定列表的元素,作为假设我有第一个向量由(1,2,3,4)给出的向量,然后我现在想要循环遍历此向量并将获得的第二个向量附加到原始列表,再次循环列表中的第二个向量并获取第三个向量,该向量也附加在原始列表中,依此类推。我有这个代码以`

开头
occlist <- list()
occ_cell <- c(1,2,3,4)

for(i in occ_cell){
  occ_cell <- seq(i,4*i, by = 1)
  occlist[[i]] <- occ_cell
}
`

给出以下列表

#[[1]]
#[1] 1 2 3 4

#[[2]]
#[1] 2 3 4 5 6 7 8

#[[3]]
# [1]  3  4  5  6  7  8  9 10 11 12

#[[4]]
# [1]  4  5  6  7  8  9 10 11 12 13 14 15 16

我认为更清楚,让我们有下图

In that image we have 2 levels and the values in each level should be appended to a list, again each level is computed from the previous level.(i.e. in level two we have values obtained from level one (1,2,3,4,) and values from level one is obtained from level 0 (1)

1 个答案:

答案 0 :(得分:3)

recOcc <- function(i) {
    if (i == 0) return ( NULL )
    append( recOcc(i-1), list(seq(i, 4*i)) )
}

然后打电话给(以重现你的输出)

recOcc(4)
# [[1]]
# [1] 1 2 3 4
# 
# [[2]]
# [1] 2 3 4 5 6 7 8
# 
# [[3]]
#  [1]  3  4  5  6  7  8  9 10 11 12
# 
# [[4]]
#  [1]  4  5  6  7  8  9 10 11 12 13 14 15 16

您还可以使用Recall在递归调用中命名递归函数,这样可以更改函数名称。

修改

对于树结构,您可以尝试这个

## i is the number to start the sequence
## depth determines how deep to recurse
recOcc2 <- function(i, depth=3, cur.depth=0) {
    if (depth==cur.depth) return(seq(i, 4*i))
    acc <- as.list(seq(i, 4*i))
    for (ii in seq_along(acc))
        acc[[ii]] <- recOcc2(acc[[ii]], depth, cur.depth+1)
    acc
}

## To recreate the simple list
res <- recOcc2(1, depth=1)

## For nested lists
res <- recOcc2(1, depth=2)