【问题标题】:Ruby - recursive each for n-ary treeRuby - 递归每个 n 叉树
【发布时间】:2011-08-16 16:49:32
【问题描述】:

已修复:请参阅 EDIT 编辑

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

【问题讨论】:

  • 要在什么类上定义?你应该用类体包围你的代码。
  • 您还应该描述如何在 n 叉树实例上定义 @element@children
  • 该类被省略,因为我认为这是问题区域。我不太确定了...... @element 和 @children 都被传递给构造函数,@element 作为任何对象,@children 作为数组。
  • sawa,要求班上的其他人做到了。我发现了我的问题。此类中的一个单独方法 to_s 会更改树的元素,但会打印出正确的答案。在使用每个之前,我总是对此进行测试,所以我确定每个都是问题。

标签: ruby recursion tree each recursive-descent


【解决方案1】:

从你的回复来看,在我看来你想要的是这样的:

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

【讨论】:

  • 看起来不错,但不好的是你不能使用没有块的树对象的each 方法来构造迭代器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2016-04-19
  • 2014-03-29
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多