我有一个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)
}
希望这有助于未来的读者!!
答案 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)
}
快乐[重新]咒骂!