[ruby-list:43143] 再帰メソッド、呼び出し先で引数を書換えたが呼出元に反映されない
From:
Masou <mas@...>
Date:
2007-01-29 08:23:45 UTC
List:
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/