From: Masou Date: 2007-01-29T17:23:45+09:00 Subject: [ruby-list:43143] 再帰メソッド、呼び出し先で引数を書換えたが呼出元に反映されない Masou と申します。 「たのしいRuby 第2版」で勉強中です。 その中の練習問題をやってるときに理解できない現象にあたりました。 再帰メソッドの呼び出し先で引数を書換えたが呼出元に反映されないのです。 以下、プログラムとその結果です。 def taio(a, st0) @ne += 1; p [@ne, 11, st0, a] st1 = a.shift; p [@ne, 12, st0, st1, a] case st1 when nil; p [@ne, 20, "end"] when ")"; p [@ne, 30, st0, st1, a] if st0 == "(" st0 = ""; st1 = ""; p [@ne, 31, st0, st1, a] taio(a, st1); p [@ne, 32, st0, st1, a] else st0 = "No!"; st1 = "No!"; p [@ne, 39, st0, st1, a] end when "}"; p [@ne, 40, st0, st1, a] if st0 == "{" st0 = ""; st1 = ""; p [@ne, 41, st0, st1, a] taio(a, st1); p [@ne, 42, st0, st1, a] else st0 = "No!"; st1 = "No!"; p [@ne, 49, st0, st1, a] end else; p [@ne, 50, st0, st1, a] taio(a, st1); p [@ne, 51, st0, st1, a] end p [@ne, 59, st0, st1, a] if st1 == "No!" st0 = "No!"; st1 = "No!"; p [@ne, 61, st0, st1, a] else if st0 != "" st0 = "No!"; st1 = "No!"; p [@ne, 62, st0, st1, a] end end p [@ne, 99, st0, st1, a] @ne -= 1 end st = "" # Status: "", "No!", nil a = ["(", "{", ")", "}"] @ne = 0; st = ""; taio(a, st) 結果です。(見やすいようにインデントしてます) [1, 11, "", ["(", "{", ")", "}"]] [1, 12, "", "(", ["{", ")", "}"]] [1, 50, "", "(", ["{", ")", "}"]] [2, 11, "(", ["{", ")", "}"]] [2, 12, "(", "{", [")", "}"]] [2, 50, "(", "{", [")", "}"]] [3, 11, "{", [")", "}"]] [3, 12, "{", ")", ["}"]] [3, 30, "{", ")", ["}"]] [3, 39, "No!", "No!", ["}"]] [3, 59, "No!", "No!", ["}"]] [3, 61, "No!", "No!", ["}"]] [3, 99, "No!", "No!", ["}"]] [2, 51, "(", "{", ["}"]] [2, 59, "(", "{", ["}"]] [2, 62, "No!", "No!", ["}"]] [2, 99, "No!", "No!", ["}"]] [1, 51, "", "(", ["}"]] [1, 59, "", "(", ["}"]] [1, 99, "", "(", ["}"]] ここまで [3, 99, "No!", "No!", ["}"]]で引数st0に"No!"を渡して返ると [2, 51, "(", "{", ["}"]] st1に "No!"が返ってないのです。 もっと簡単な例にしようとしたんですが、現象が再現できないので オリジナルのまま張りつけました。 Rubyを理解してないのか、再帰の使いかたが悪いのかわかりません。 よろしくお願いします。 ttp://masou.blogspot.com/