R - 深度搜索中的递归数组分辨率

时间:2015-03-12 09:17:42

标签: arrays r recursion

我有一个ID arr数组,形成一个树

ID    CHILD 
11       12
11       13
12       14
12       16
13       17
13       18
18       19

我需要一个递归函数,它告诉我任何给定ID的最大深度。

的内容
res<-function(element,
              arr,
              depth)
{
X<-arr[which(arr[,"ID"]==element),"CHILD"]
  if(length(X)==0) return(depth)
  for (e in X){
    depth<-depth+1
    res(element=e,
        arr=arr,
        depth=depth)
  }
}

然而,这会将深度计数器带到下一个孩子并增加它(我相信)..

我找到了this reply,但我正在使用数组并需要深度,而不是索引。我的大脑不能绕过它了。

更新 - 解决方案

感谢Dominic Comtois提供基于图表的解决方案。 与此同时,我的大脑决定提出一个解决方案,类似于我最初发布的解决方案,也将宽度作为树中最低级别元素的数量,它看起来像:

glob_max_depth<-0
glob_max_width<-0

res<-function(element,
              arr,
              depth
              ){
    X<-arr[which(arr[,"ID"]==element),"CHILD"]
    for (e in X){
      res(element=e,
      arr=arr,
      depth=depth+1
      )
    }
    if(depth>glob_max_depth){
      glob_max_depth<<-depth
    } 
    if(length(X)==0){
      glob_max_width<<-glob_max_width+1 
    } 
  return(glob_max_depth)
}

希望这有助于未来的读者!!

1 个答案:

答案 0 :(得分:1)

我发现R中的递归非常痛苦。我最近使用igraph包使用boggler solutioner工作(相当),并且必须找到&#34;路径&#34;在图表中,这与您正在做的事情类似。它与仅仅寻找最长的路径不同,但它会为您提供更多信息,并且由于绘图能力,我发现图表很适合。

无论如何,如果您对此路线感兴趣,请参阅此post。要构建图表,你可以使用这样的东西(我将你的ID减去10,并且儿童和儿童的工作与igraph合作得很好):

library(igraph)
el <- matrix(data = c(1,1,2,2,3,3,8,2,3,4,6,7,8,9), ncol = 2)
g <- graph.edgelist(el, directed=TRUE)
plot(g)

然后,您可以使用以下代码找到不同长度的路径(此处为3和4):

getPaths <- function(v, g, L = 4) {
  paths <- list()

  recurse <- function(g, v, path = NULL) {
    path <- c(v, path)

    if (length(path) >= L) {
      paths[[length(paths) + 1]] <<- rev(path)
    } else {
      for (i in neighbors(g, v)) {
        if (!(i %in% path)) recurse(g, i, path)
      }
    }
  }
  recurse(g, v)
  return(paths)
}

paths <- list()
for(L in 3:4) {
  paths[[as.character(L)]] <- getPaths(1,g,L=L)
}

快乐[重新]咒骂!