javaについて質問です
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&&c<b)||(a<b&&c>b))
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でも同じ判定を行っていると言えるのでしょうか?
お礼
わかりました。 お陰様で解決しました。 ありがとうございます。