2017-05-14 4 views
1

配列内の検索ツリーから値を保存しようとしていますが、グローバル変数なしではできません。可能であれば再帰を維持したいと思います。グローバル変数を使用せずにsearchtreeの値を配列に保存

$array = [] 
def to_array(s) 
    if s != {} 
    $array << s[:value] 
    to_array(s[:left]) 
    to_array(s[:right]) 
    end 
end 

searchtreeは次のようになります。

st1 = {:key=>2, :value=>0, 
    :left=>{}, 
    :right=>{:key=>17, :value=>1, 
      :left=>{:key=>13, :value=>2, 
        :left=>{:key=>10, :value=>4, 
          :left=>{}, 
          :right=>{:key=>11, :value=>5, 
            :left=>{}, 
            :right=>{}}}, 
        :right=>{:key=>14, :value=>6, 
          :left=>{}, 
          :right=>{}}}, 
      :right=>{:key=>22, :value=>3, 
        :left=>{}, 
        :right=>{:key=>48, :value=>7, 
           :left=>{:key=>42, :value=>8, 
             :left=>{}, 
             :right=>{}}, 
           :right=>{:key=>77, :value=>9, 
             :left=>{}, 
             :right=>{}}}}}} 

は、どのように私はグローバル変数を使用せずに配列の値を保存するに行きますか?

すべての回答を事前におねがいします。

答えて

1

あなただけのメソッドに変数を渡すと、それを返すことができます:

def to_array(tree, array = []) 
    unless tree.empty? 
    array << s[:value] 
    to_array(s[:left], array) 
    to_array(s[:right], array) 
    end 

    array 
end 

あなたはarrayがデフォルトとして空の配列を持っているので、最初のアレイを作成することなく、第1の再帰でメソッドを呼び出すことができます。

+0

感謝を。 – y4my4m

0

もう1つの答えが示唆されているように、デフォルトパラメータはグローバル変数を避けるための良い方法です。また、インスタンス変数を使用することができます。

@array = [] 
def to_array(s) 
    if s != {} 
    @array << s[:value] 
    to_array(s[:left]) 
    to_array(s[:right]) 
    end 
    @array 
end 

クラスを定義しない場合、それはmainオブジェクトの下に変数になります。また、あなたはローカル変数を返すことができます。

def to_array(s) 
    array = [] 
    if s != {} 
    array << s[:value] 
    array << to_array(s[:left]) if s[:left] != {} 
    array << to_array(s[:right]) if s[:right] != {} 
    end 
    array.flatten 
end 

(これはおそらく、空のハッシュのために非常に多くのチェックを行うことを避けるためにビットを締めることができます。)たくさん助け答え、のため

関連する問題