Ruby - 为n-ary树递归

时间:2011-05-02 01:27:24

标签: ruby recursion tree each recursive-descent

修正:请参阅编辑编辑

嘿伙计们,

我在为一个n-ary树编写自己的递归时遇到了麻烦。 @element是节点的值,@children是所有连接的较低节点的数组。这是我的方法:

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,甚至没有意识到它。为此表示歉意。 (不能让我回答我自己的问题,因为我是新手)。

1 个答案:

答案 0 :(得分:3)

从您的回答来看,在我看来,您想要的是这样的:

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