R树与n分支

时间:2015-11-17 23:10:41

标签: r recursion tree logic

如何生成一个包含n个节点的树,每个节点都有m个子节点,条件是每个子节点都是通过fun(parent)获得的?

我从this post收集了一些逻辑,但我仍然坚持如何生成最多n个名称,以及如何生成用于递归地将新生成的子项分配给父项的函数。 (在这里插入乌托邦笑话)

- 编辑 -

我尝试使用下面的TheTime&#s解决方案,这肯定回答了这个问题。但是,我没有提出我想要的问题。因为这个问题有一个很好的答案,在某些情况下可能有用,我发布了一个新问题,询问我的真正含义here

1 个答案:

答案 0 :(得分:1)

递归是一种方式,或者你可以使用'堆栈'数据结构。我不确定您正在考虑使用哪种功能或计划存储什么类型的值,因此这里只是一个使用其父名称创建子节点名称的函数同样。

## Function to apply to nodes to create children
nodeNamer <- function() {
    i <- 0
    function(node) sprintf("%s -> %g", node$name, (i <<- i+1))
}

make_tree <- function(depth, m, fn) {
    root <- Node$new('root')

    ## Some helper function to recurse
    f <- function(node, depth) {
        if (depth <= 0) return( root )
        for (i in seq.int(m)) {
            val <- fn(node)  # apply some function to parent node
            child <- node$AddChild(val)
            Recall(child, depth-1)  # recurse, Recall refers to 'f'
        }
    }
    f(root, depth)
    return( root )
}

## Make a tree with depth of '2' and 3 branches from each node
## Note that the way I defined the naming function, you must call it 
## in order to reset the the counter to 0
res <- make_tree(2, 3, nodeNamer())

res
#                  levelName
# 1  root                   
# 2   ¦--root -> 1          
# 3   ¦   ¦--root -> 1 -> 2 
# 4   ¦   ¦--root -> 1 -> 3 
# 5   ¦   °--root -> 1 -> 4 
# 6   ¦--root -> 5          
# 7   ¦   ¦--root -> 5 -> 6 
# 8   ¦   ¦--root -> 5 -> 7 
# 9   ¦   °--root -> 5 -> 8 
# 10  °--root -> 9          
# 11      ¦--root -> 9 -> 10
# 12      ¦--root -> 9 -> 11
# 13      °--root -> 9 -> 12