3

固定:见编辑编辑

我在为 n 叉树编写自己的递归时遇到了麻烦。@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,甚至没有意识到。为此表示歉意。(不能让我回答我自己的问题,因为我是新手)。

4

1 回答 1

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.

于 2011-05-02T02:13:18.650 回答