gpt4 book ai didi

Ruby - 递归每个 n-ary 树

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:48 25 4
gpt4 key购买 nike

固定:见编辑编辑

我在为 n 元树编写自己的递归 each 时遇到了麻烦。 @element是节点的值,@children是所有相连的下层节点的数组。这是我的方法:

def each
yield(@element)

@children.each { |x|
x.each { |i| yield i}
}
self
end

问题是它重复了较低的元素。例如,如果我使用它来打印一个值为 o 和一个子节点 c 的节点,它将打印“occ”而不是“oc”。我真的不知道发生了什么,所以我尝试的所有修复都无效。有什么想法吗?

编辑:我认为这可能是因为除了生成节点值之外,它还以某种方式在节点值上调用 each ,因此当它是单个字符的字符串时,它将生成该字符,然后使用 .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

关于Ruby - 递归每个 n-ary 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com