微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ruby-每个n元树的递归对象

如何解决Ruby-每个n元树的递归对象

| 固定:请参见编辑 大家好, 我在为n元树编写自己的递归时遇到麻烦。 “ 0”是节点的值,“ 1”是所有连接的下层节点的数组。这是我的方法
def each
  yield(@element)

  @children.each { |x|
    x.each { |i| yield i}
  }
  self
end
问题在于它重复了较低的元素。例如,如果我用它来打印一个值为o和一个孩子c的节点,它将打印\'occ \'而不是\'oc \'。我真的不知道发生了什么,因此所有尝试的修复都无效。有任何想法吗? 编辑:我认为这可能是因为除了生成它之外,它还在某种程度上调用了节点值,因此当它是单个字符的字符串时,它将生成该字符,然后通过
.each
调用再次生成它。 编辑:谢谢大家阅读,但我搞砸了。问题不在此方法中,而是在同一类的另一个方法中,to_s。 to_s将正确打印,但是如果它是字符串,则更改父节点的值。每当我测试时,我总是先使用to_s,甚至没有意识到。为此事道歉。 (因为我是新手,所以不能让我回答自己的问题)。     

解决方法

从您的回应来看,在我看来您想要的是这样的:
class Tree
  def initialize element,children = []
    @element,@children = element,children
  end
  def each &pr
    pr.call(@element)
    @children.each{|x| x.each(&pr)}
    self
  end
end

a = Tree.new(\'self\')
b = Tree.new(\'parent\',[a])
c = Tree.new(\'grandparent\',[b])

c.each{|x| puts x}
# => grandparent
# => parent
# => self

b.each{|x| puts x}
# => parent
# => self
一个注意事项是,由于您似乎想递归地传递proc对象,因此最好将其作为参数作为
&pr
而不是使用
yield
来获得。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。