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 }

「引数の数が間違っています (1 に対して 0)」というメッセージが表示されます。これはおそらく私が構文で行っているばかげたものであることは知っていますが、これが行われている(基本的なものでさえ)例を見つけることができません....コードの使用方法を誤解していると思います- 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

結局、それは元のメソッド呼び出しではありませんでしたが、メソッドが再帰的にそれ自体を呼び出す方法が問題でした。これは、コードブロックがどのように機能するかを本当に理解していなかったことが原因ではないようです。

追加の「yield self」呼び出しを使用したフィリップの回答は完全に機能しました。

どうもありがとうございました!

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 に答える