2017-03-25 2 views
0

1つの課題は、逆に、下記のリンクリストの:data値を印刷することである:私の方法は、上記のコードを渡されたとき{:data=>3, :next=>{:data=>2, :next=>{:data=>1, :next=>nil}}} だから、それは返す必要がありますprint_linked_list_in_reverse関数が機能しないのはなぜですか?私がやっているRubyの過程で

1 
2 
3 

ここで私の試みは、上記のコードでは動作しません。私はなぜ理解できない、と誰かが私が間違ってやっているかを説明することができれば、私はそれを感謝したい:

def print_list_in_reverse(hash) 
    if hash[:next].nil?      #i.e. is this the final list element? 
    print "#{hash[:data]}\n" 
    return true 
    else 
    #as I understand it, the next line should run the method on `hash[:next]` as well as checking if it returns true. 
    print "#{hash[:data]}\n" if print_list_in_reverse(hash[:next]) 
    end 
end 

ここで、それはあなたが私のミスを見つけることができます場合には解決策は、です。

def print_list_in_reverse(list) 
    return unless list 
    print_list_in_reverse list[:next] 
    puts list[:data] 
end 

ありがとうございます。

答えて

1

解決策は戻り値に依存し、else句に明示的に指定しないでください。実際には、Rubyは評価された最後のステートメントの結果を返すので、暗黙的に実行します。printステートメントの場合はnilです。 Rubyではfalsenilはどちらも論理的に偽であり、printは最後の2回の呼び出しを除いてすべてバイパスされます。あなたの選択はelseの最後にtrueを追加するか、戻り値に依存しない解決策を作ることです。

戻り値の必要性を否定するには、現在の呼び出しの情報に基づいてどの論理が正当であるかをチェックします。あなたは、 "真実性"の無限のオブジェクトを活用することによって、あなたの人生を単純化することができます。逆に物事を得る基本的な再帰的ロジックは、「リストの残りのものを印刷してから、自分のものを印刷する」ことです。 truthinessに基づいた簡単な実装は次のようになります。

def print_list_in_reverse(hash) 
    print_list_in_reverse(hash[:next]) if hash[:next] 
    print "#{hash[:data]}\n" 
end 

ことの問題は、あなたが何かを印刷したくない場合は、空のリストを、渡されたかもしれないということです。これは簡単にチェックできます:

def print_list_in_reverse(hash) 
    print_list_in_reverse(hash[:next]) if hash[:next] 
    print "#{hash[:data]}\n" if hash 
end 

ハッシュが渡されている限り、それは空でも機能します。あなたがnilを渡される神経質なら:

def print_list_in_reverse(hash) 
    print_list_in_reverse(hash[:next]) if hash && hash[:next] 
    print "#{hash[:data]}\n" if hash 
end 

他の代替は、現在のリスト要素がnilかどうかをチェックし、その場合にはすぐに返すことによって開始することです。それ以外の場合は、上で概説した基本的な再帰的ロジックに従います。その結果、あなたが提供したソリューションが得られます。

+0

ありがとう@pjs、最初の2行だけで十分でしたが、追加情報は非常に有益であり、非常に感謝しています。 – adc17

+0

ようこそ。私はGuido van Rossumが言っていることにかかわらず、何かをする方法は複数あり、代替案を探索するのは楽しいから、残りの部分を追加しました。 – pjs

2

あなたのコードの問題はelseの場合です。 hash[:data]を印刷するにはtrueを返す必要があります。あなたのメソッドは、常に最後の2つの要素を出力します。

1

ハッシュのすべての値を繰り返し処理し、メインハッシュ内に他のハッシュ値がなくなるまで値をプッシュする方がよい。

def print_list_in_reverse(hash, results = []) 
    hash.each_value do |value| 
    if value.is_a? Hash 
     print_list_in_reverse(value, results) 
    else 
     results << value unless value.nil? 
    end 
    end 

    results.reverse 
end 

p print_list_in_reverse(data) 
=> [1, 2, 3] 
+0

ハハ、それは結果を逆転させるのが良い点です。これは実際に再帰的な解決法を見つけるよう励ましてくれた運動の一部でしたが、これもうまくいくことを否定することはできません。 – adc17

関連する問題