2

我用 ruby​​ 编写了一个非常简单的递归树遍历方法。我想产生这种遍历的结果,以便我可以轻松地遍历树的节点。

def bottom_up_traversal (node)
    if(node.has_leaf_children?)
        node.children.each{|i| yield i} 
    else
        node.children.each{|i| bottom_up_traversal(i)}
        yield node
    end

end

当我尝试调用它时,例如:

 bottom_up_traversal(@root){|this_node| puts this_node }

我得到一个“错误数量的参数(0 代表 1)”。我知道这可能只是我用语法做的一些愚蠢的事情,但我找不到任何(甚至是基本的)这样做的例子......这让我相信我误解了我应该如何使用代码 - bocks(这对我来说无疑是新事物)

那么,您能否告诉我应该如何调用此方法,或者我哪里出错了?

4

2 回答 2

3

在您调用的方法中,当您bottom_up_traversal(i)第一次调用它时,您没有传递原始块。未经测试,但我认为你想要更像这样的东西:

def bottom_up_traversal (node, &block)
    if(node.has_leaf_children?)
        node.children.each{|i| yield i} 
    else
        node.children.each{|i| bottom_up_traversal(i, &block)}
    end
end
###
bottom_up_traversal(@root){|this_node| puts this_node }
于 2012-11-02T17:24:31.527 回答
1

最后,这不是原始方法调用,而是方法递归调用自身的方式才是问题所在,这并不是因为我没有真正理解代码块的工作原理。

菲利普用额外的“让步自我”电话回答完美。

非常感谢你!

def bottom_up_traversal (node, &block)
    if(node.has_leaf_children?)
        node.children.each{|i| yield i} 
        yield node
    else    
        node.children.each{|i| bottom_up_traversal(i, &block)}
        yield node
    end
end

叫喜欢

bottom_up_traversal(@root){|this_node| puts this_node }

以完美的顺序遍历它们。

于 2012-11-02T17:47:12.093 回答