3つの整数の中央値を求めるメソッドについての質問

このQ&Aのポイント
  • 2つのコードがありますが、問題の解説によると、2番目のコードの方が実行効率が悪いとされています。
  • 解説によると、最初のif文の判定と2番目のif文の判定が実質的に同じであるため、効率が悪くなるとされています。
  • 具体的には、b >= aおよびb <= aの判定を裏返した条件が、2番目のif文の条件として用いられているため、同じ判定を重複して行っていると言えます。
回答を見る
  • ベストアンサー

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でも同じ判定を行っていると言えるのでしょうか?

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • y_shimizu
  • ベストアンサー率41% (27/65)
回答No.1

2のif文に a<c<b となる値が入力された場合、 b>=a →trueなのでandの次へ c<=a →falseなのでorの次へ b<=a →falseなのでelseへ a>b →falseなのでorの次へ a<b →trueなのでandの次へ c>b →falseなのでelseへ という感じで処理されますね。 ここで、aとbの判定だけ見てみると b>=a →true b<=a →false a>b →false a<b →true これは上2つの判定は下2つの判定を包括していますね。 つまり、aがbより大きいか同値、である場合、aがbより大きい、の判定は同じ結果となるので、不要といえます。 「実質的に同一の判定」とはこれを言っているのではないでしょうか。

akaragaostream
質問者

お礼

ありがとうございました

関連するQ&A

  • javaのプログラミングについての質問です。

    javaのプログラミングについての質問です。 Appletを用いて、後置記法によるインタラクティブなミニお絵描き言語を設計 し、実現しなさい。たとえば、 100<return>150<return>200<return>250<return>line<return> とキーボード入力すると、 → Applet上に(100,150)から(200,250)への直線が描かれる。 自分で作ったソースコードの一部です。(全部ペーストし切れませんでした) interface Fun { //関数のインターフェース void eval(MyStack s); //演算を実行 boolean iam(String s); //自分の名前がsと等しいかどうかを判定するメソッド // →自分が呼ばれたかどうかを判定する。 } abstract class Draw implements Fun{ public void eval(MyStack s){ int a, b,c,d; //第一引数と第二引数 a = s.pop(); //それぞれpop b = s.pop(); c = s.pop(); d = s.pop(); s.push((int) draw(a,b,c,d)); //実行は抽象メソッドで行う } abstract int draw(int a, int b,int c,int d); } class DrawLine extends Draw{ public boolean iam(String str){return str.equals("line");} int draw(int a, int b,int c,int d){ Graphics.drawLine(a,b,c,d); // ※ここが問題です。 } } ※のところで  Graphics の非 static メソッド drawLine(int, int, int, int) を static 参照することはできません というエラーメッセージが出ます。 どう直したらいいでしょうか

    • ベストアンサー
    • Java
  • メソッドが値を返すとき

    ”メソッドが値を返さない”というエラーで困っています。 次のようなプログラムでは、メソッドが値を返せないのは当たり前なのでしょうか?? public int A(){ int a= 3; int b= 5; if(条件式){ return (Math.sin(a*x)); }else if(条件式){ return (Math.cos(b*x)); }else if(条件式){ return 式 ; } } 「return」をif文のなかに入れてしまうことが,いけないのでしょうか? また,それがしてはいけない事ならば,条件式によって扱うreturn文を変えるには, どうしたら良いかアドバイスを下さい。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 3つの値の中間値を求める

    import java.util.Scanner; //このコードをどう修正したらいいですか? class Sample7_3{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print("整数a:");int a = std.nextInt(); System.out.print("整数b:");int b = std.nextInt(); System.out.print("整数c:");int c = std.nextInt(); int med = 0; if(a<b) else if(a<c)med = c; else if(b<c)med = b; System.out.println("中間値は"+med+"です。"); } }

  • javaに関しての質問です (エラー)

    最近javaの勉強を始めたばかりの者です とある動画をみながら勉強をしていたのですが なぜかエラーが出てしまいます。 エラーの内容は... エラー:この文に制御が移ることはありません     if( c== 13){ エラー:return文が指定されていません この二つです、もし解決方法がわかる方がいましたらぜひ教えてくれるとうれしいです 下がソースコードになります。 public class part01 { static String name = "すけさん"; static int lv = 30; public static void main( String[] args )throws java.io.IOException { putzyosyou(); // 序章を表示 putcommnd(); if(lv<40){ putgameover(); }else{ putgamecrear(); } } public static void putzyosyou() { System.out.println("魔王が世界を滅ぼそうとしている。"); System.out.println(name + "はレベルが" + lv + "のツワモノです"); } public static void putcommnd()throws java.io.IOException { System.out.println("1.魔王を倒しに行く"); System.out.println("2.修行する"); System.out.println("3.だれかに頼る"); System.out.println("4.そんなことよりも寝よう"); int c = inputcommnd(); if( c== '1' ){ System.out.println("魔王が現れた!!"); }else if( c== '2' ){ lv += 2; System.out.println ("レベルが"+ lv + "になった!!"); putcommnd(); } } public static int inputcommnd()throws java.io.IOException { int c = System.in.read(); if( c== 10){ return( inputcommnd() ); if( c== 13){ return( inputcommnd() ); } return( c ); } } public static void putgameover() { System.out.println(name + "は負けました。"); System.out.println("GAME OVER"); } public static void putgamecrear() { String str = name + "は魔王を倒しました。"; put( str ); if(lv>120){ System.out.println("レベル" + lv + "なので魔王ゴミでした"); }else if(lv>80){ System.out.println("レベル" + lv + "なので余裕でした"); }else if(lv>50){ System.out.println("レベル" + lv + "なので倒せました"); }else{ System.out.println("レベル" + lv + "なので苦戦しました"); } System.out.println("GAME CREAR"); } static void put( String str ) { System.out.println( str ); } }

    • ベストアンサー
    • Java
  • javaプログラムについて

    */コマンドライン引数で2つの数字と1つの記号を受け取ります。 * //受け取った記号が『+』ならplusメソッドを呼び出し、 * //受け取った記号が『-』ならminusメソッドを呼び出し、 * //受け取った記号が『×』ならmultiplyメソッドを呼び出し、 * //受け取った記号が『÷』ならdivideメソッドを呼び出し、 * //それ以外が入力された場合は『計算できません。』と表示する * //プログラムを作成してください。 * */ public class MethodAdd9 { public static void main(String[] args) { int input1 = Integer.parseInt(args[0]); int input2 = Integer.parseInt(args[1]); String sign = args[2]; //ここにプログラムを追加してください if(sign.equals("+")){ plus(input1,input2);//プラスメソッドへ } if(sign.equals("-")){ minus(input1,input2);//マイナスメソッドへ } if(sign.equals("*")){ multiply(input1,input2);//掛算メソッドへ } if(sign.equals("/")){ divide(input1,input2);//割算メソッドへ } } // 四則演算を行うメソッドを追加 //プラスメソッド表示 public static void plus(int a,int b){ int c=a+b; System.out.println(a+b); } //マイナスメソッド表示 public static void minus(int d,int e){ int f=d-e; System.out.println(d-e); } //掛算メソッド表示 public static void multiply(int g, int h){ int i=g*h; System.out.println(g*h); } //割算メソッド表示 public static void divide(int j,int k){ int l=j/k; System.out.println(j/k); } } ここまで出来て、記号を認識してくれるようにはなったのですが、何故か"*"掛算の記号だけ読み込んでくれません。また、ここから「計算出来ません」と表示させるにはどうすれば良いでしょうか。知恵をお貸しください。

  • 複雑な条件の書き方

     こんにちは。c#初心者です。(今回の質問はcに近い言語ならどれでも大差ないと思います)  複雑な条件を使って処理を分岐する場合、 if ( A || (B && (C || D || E)) && F) // A~Fは条件 else  のようになったりすることもあると思いますが、それがさらに複雑化して if ( value1 < A || (B && ( (value1 = values[index]) == C || D || E)) && (value1 = values[value2]) == F ) else ( A~Fはフィールド(インスタンス)変数やstaticな変数で、それ以外はローカル )  のように代入まで入ってきているようなコードがあった場合は、さら乱雑になるので bool satisfied(ref int value, int value2, int[] values, int index) {   if ( value1 < A ) return true;   if ( !B ) return false;   value1 = values[index];   if ( value1 != C && !D && !E ) return false;   value1 = values[value2];   return value1 = F; }  のようなメソッドに抽出して if ( satisfied(ref value1, value2, values, index) ) … else … のようにしたほうが良いのでしょうか?  ちなみにこれらの条件は(初心者が見る限り多分)これ以上細かく分離できず、再利用される場所がありません。  そのためメソッドにしてしまわず、インデントなどを駆使して if ( value1 < A ||   (     B &&     (       (value1 = values[index]) == C       || D || E     )   )   && (value1 = values[value2]) == F ) else  のようにするだけでも良いのでしょうか?(何だかやりすぎて、逆に見にくくなった気が…)  この辺の事はよくわからないので皆さんのご意見を伺わせてください。

  • javaプログラムについて

    mainメソッド内の指定された部分の処理を、 別のメソッドに分けてください。 mainメソッド内から作成した別メソッドを呼び出して 実行できるようにしてください。 ※分ける前と分けた後で処理結果が変わらないこと (入力された文字が"A"の場合true, それ以外の場合falseを返すように) */ class MethodAdd1{ public static void main(String[] args){ /* // ★ここから if("A".equals(args[0])){ judge = true; }else{ judge = false; } // ★ここまで */ boolean judge; if("A".equals(args[0])){ System.out.println("true"); }else{ System.out.println("false"); } } /* **戻り値:boolean **引数:String */ //ここにメソッドを作成 public static boolean equals(String a){ String str="A"; if("A".equals(str)){ return true; }else{ return false; } } } これで一応trueかfalseと表示されるのですが、合っているのか分かりません。 お時間のある方で、手直しをして頂ける方お願い致します。

  • javaハノイの塔について

    public class hanoinotou { static void move(int n,int a,int b , int c) { if(n>1) move(n-1,a,c,b); System.out.println("円盤"+n+":"+a+"→"+c); if(n>1) move(n-1,b,a,c);} public static void main(String args[]){ move(3,1,2,3); } } ↑このプログラムの動き方を教えてください よろしくお願いします

  • Javaについて質問します。

    全員のjudgeBMIの適用結果を表示させたいのですが 下から4行目のcalcBMIにエラーが出てしまいます。 どこを修正すればいいかわからなく困っています。 わかる方いましたら教えていただきたく質問しました。 public class Enshu14_3 { private static double calcBMI(double weights, double heights){ return(weights/(heights*heights)); } private static String judgeBMI(double bmi){ String result; if(bmi<18.5){ result="やせ"; }else if(30.0<=bmi){ result="高度肥満"; }else if(25.0<=bmi){ result="肥満"; }else{ result="標準"; } return result; } public static void main(String[] args){ double[] weights = {64.0,51.5,70.2,58.3,85.4}; double[] heights = {1.65,1.67,1.66,1.75,1.68}; for(int i=0; i<weights.length; i++){ System.out.println(i+"番目の人は"+judgeBMI(calcBMI(weights,heights))+"です。"); } } }

  • 1と0の文字列作成

    1の後には0.9の確率で1、0.1の確率で0 0の後には0.9の確率で0、0.1の確率で1 という条件で、1と0の文字列作成しようと下のプログラムを作ってみました。 しかし実行してみるとなぜか1の後には0がきてしまうことが多く、条件のようになりません。 どこがおかしいのででしょうか? public class Sample{ public static void main(String[]args){ int a[]=new int[50]; Kansuu1 b = new Kansuu1(); Kansuu2 e = new Kansuu2(); a[0] = 0; for(int i=0; i<50; i++){ if(i==0){ System.out.print(0); }else{ int c = 0; if(a[i-1]==0){ c = b.kan1(a[i]); }else { c = e.kan2(a[i]); }System.out.print(c); } } } } class Kansuu1{ int kan1(int a){ if(Math.random()>0.9){ return 1; }else { return 0; } } } class Kansuu2{ int kan2(int a){ if(Math.random()>0.9){ return 0; }else { return 1; } } }

    • ベストアンサー
    • Java

専門家に質問してみよう