3つの整数の中央値を求めるメソッドについて質問です。 まずは以下の2つのコードをご覧ください --------------(1)------------------ static int med3(int a,int b,int c){ if(a>=b){ if(b>= c) return b; else if(a<=c) return a; else return c; }else if(a>c) return a; else if(b>c) return c; else return b; } -----------(1)----------- -----------(2)----------- static int med3(int a,int b,int c){ if((b>=a&&c<=a)||(b<=a&&c>=a)) return a; else if((a>b&&cb)) return b; else return c; } -----------(2)----------- 上記の2つのメソッドは参考書の問題に載っているものです。 因みに問題文は、 「中央値を求める手続きは(2)のようにも実現できる。しかしこれは(1)に比べると、実行効率が悪い。その理由を考察せよ」 です。 この問題の解説について質問があります。 解説には、こうあります。 「最初のif文の判定 if ((b >= a && c<= a) || (b <= a && c >= a) に着目します。ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降で else if ((a > b && c < b) || (b <= a && c > b) と行われます。つまり、最初のifが成立しなかった場合、2番目のifでも(実質的に)同じ判定を行っているため、効率が悪くなるのです。」 そこで2つ質問があるのですが、まず一つ目から。 「ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降でelse if ((a > b && c < b) || (b <= a && c > b)と行われます。」の部分の日本語は、一体どういう意味なのでしょうか? b >= a,b <= aの判定を裏返したものはb < a,b > aとなると思うのですが、しかしそれだとその後に続くelse if文の条件、(a > b && c < b) || (b <= a && c > b)と合いません。 2つ目の質問です。 なぜ、ifが成立しなかった場合、何故2番目のifでも同じ判定を行っていると言えるのでしょうか?
↧