首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >s3类的r中分类树问题的递归

s3类的r中分类树问题的递归
EN

Stack Overflow用户
提问于 2021-05-23 16:10:43
回答 1查看 37关注 0票数 1

我正在编写一个类(s3),它应该使用构造函数为该类创建一个实例,至少在开始时是这样。构造函数junction(name, left, right)。其中name是对分类树中节点的描述。

因此,我有一个名为junction的类,如上所述,它有3个条目。

代码语言:javascript
复制
junction <- function(name = character()) {
  left = NULL
  right = NULL
  value <- list(name = name, left = left, right = right)
  attr(value, "class") <- "junction"
  value
}

leftright对应于树的下一个左节点和右节点,但在叶节点变为NULL。我需要正确地定义上面的构造函数,这样我才能创建一个叶节点。然后,我尝试编写一个简单的print方法,该方法递归地生成以下示例;

代码语言:javascript
复制
junction("Tom", junction("Wendy", junction("Jane"), junction("Nancy")), junction("Ellen"))

Tom
+- Wendy
| +- Jane
| +- Nancy
+- Elen

所以有没有任何关于如何编写print.junction(obj, some_str, ...)的想法,我在这里添加了some_str,我认为它可能有助于递归-在当前节点上的输出之前提供字符串。java甚至c++都有这种递归的想法,但我找不到任何与R相关的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-23 16:30:17

如果您将构造函数更改为类似于

代码语言:javascript
复制
junction <- function(name = character(), left=NULL, right=NULL) {
  value <- list(name = name, left = left, right = right)
  attr(value, "class") <- "junction"
  value
}

然后,您可以定义递归打印语句

代码语言:javascript
复制
print.junction <- function(x, nested=FALSE) {
  adorn <- function(v) if (length(v)>0) {
    paste0(c("+-", rep("| ", length(v)-1)), v)} else {c()}
  r <- x$name
  child <- c()
  if (!is.null(x$left)) {
    rl <- print.junction(x$left, nested=TRUE)
    child <- c(child, adorn(rl))
  }
  if (!is.null(x$right)) {
    rr <- print.junction(x$right, nested=TRUE)
    child <- c(child, adorn(rr))
  }
  if (!nested) {
    cat(c(r, child), sep="\n")
  }
  invisible(c(r, child))
}

所以当你调用

代码语言:javascript
复制
junction("Tom", junction("Wendy", junction("Jane"), junction("Nancy")), junction("Ellen"))

你会得到

代码语言:javascript
复制
Tom
+-Wendy
| +-Jane
| +-Nancy
+-Ellen

这个想法是一种简单的递归方法。您不断地调用函数,为每一层嵌套添加特殊的标记。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67657573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档