[#43103] 浮動小数点を比較するには — wada toshiki <wada-ts@...>

お世話になります。

21 messages 2007/01/11
[#43105] Re: 浮動小数点を比較するには — NISHIMATSU Takeshi <t_nissie@...> 2007/01/11

> Rubyレシピブック(P290)で 比較する数値の差を Float::EPSILON と比較する方法があり

[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/

In This Thread

Prev Next