🧩今日の学び
・偶数件と奇数件で中央値の求め方を丸ごと分けるのではなく、違いを「中央のどの位置を選ぶか」に限定すれば処理を共通化できる。
・奇数件は中央の同じ値を2つ選んで平均すると考えることで、偶数件と同じ「2つの値を足して2で割る」処理へ統一できる。
・REMAINDERなどによる偶数・奇数の判定は処理を二分するためだけではなく、異なる部分だけを条件化して共通部分を整理するためにも使える。
なるお)うー、奇数処理と偶数処理を一つにまとめるとか、悪の所業でしょこれ。
どのぐらい悪かというと、カレーを1時間ぐらい煮込んだときに、火を止める妖怪ぐらいの悪行でしょ。
結婚5年目、冷めきった夫婦関係を終わらせるために鍋の空焚きで事故に見せかけた暗殺という綿密な計画を潰す悪の所業
なんてことなのかしら!
…(チラっ)
全然聞いてないし…
もういいだもん。やるんだもん!
偶数と奇数でも共通する処理はある
な)まず、レコードの数が偶数でも奇数でも数は数えるよね
ここはどっちでも変わりなしと
その結果条件分岐するところが違うのに、それを同一処理しろって破天荒ね
高校時代の破天荒気分が抜けてないんじゃないのあの人。なんでも殴れば解決じゃないっての
偶数と奇数なんて相容れないものじゃないの?水と油でしょ?真空と山のきれいな空気みたいな関係でしょうに
奇数も「同じ値を2つ平均する」と考えられる
な)あれ?
でも、割り切れた、割り切れないどっちにしても、同じことになるんじゃ?
えーと、例えば、
レコード数が偶数(6)の場合、6 + 1 = 7 / 2 で割り切れないから、3番目と4番目の数字の平均値
って考え方だけど、
レコード数が奇数(5)の場合、5 + 1 = 6で、3番目が中央値ってことになるわけで、それを上の偶数時みたいに考えて、3番目と3番目の数字の平均値((3番目の数字 + 3番目の数字) / 2)って考えることできないかしらね、これ?
違うのは中央値を取る「位置」だけ
さすれば、その番目を出す処理だけ分岐させれば、簡単にならない?
ってことを考えるとだよ、中央値を求める処理は一本化できるんるん♪
あ、これ、ホイップクリーム構文かぁ…ということは…
係長?あんみつ買ってきていいです?
係長)良いわけ無いだろが!
な)なぜに!?
この感動を味わうためにはあんみつのホイップクリームが必要だっていうのに!
混ぜ合わせないように食べるのが至高だってのに!
クラスター爆弾かよ!
係)なんだってんだ?
な)非人道的だなって
係)どうでもいいから、さっさとやれよ!
な)くふぅ…もう人工甘味料の塊を咀嚼でもいい気分だってのに…
とりあえず、中央値の「番目」を計算で求めて、それの数字を出せば、あとは自ずと答えが出てくるってもんだと
中央値計算の番目数を出す方法は余りがあるかないかで変化させるだけ?
なんだ、簡単でやんの!
係長、ここに天才がいました
係)あっそ。じゃ説明しろ。
な)なんでそんなに素っ気ないの!?
もういいですよ。そうやって若者のやる気元気ミルキーウェイを押さえつけてれば良いんですよ!
係)はやく説明しろっての。
な)うー
真ん中の値を2つ選んで平均すればいい
だからー
①
レコード数をカウントする
②
- カウント数
+1が偶数だったら、/ 2の数に対応する額をもう一回足して平均を求める(/2)と中央値 - カウント数
+1が奇数だったら、/ 2の商とそれに1をプラスした数に対応する額を足して平均を求める(/2)と中央値
これでどうだってんですかぃ!?
係)分かりづらいな、お前…。
要するに
データの件数が
奇数なら、真ん中の値を2つ重ねて平均(同じ値)にする
偶数なら、真ん中の前後の値を平均にする
って言いたいんだろ?
な)…なんで天才を横取っちゃうのこの人!?
だから、本当の天才がゴーストライター化していくんすよ!5万はくださいよ!
係)…ま、考え方はいいだろう。
な)また文句っすか!毎回毎回文句ばっか言ってて飽きないんすか!
係)「良い」って言ってんだろ!
な)へ…?まさか、OK?
係)だからそう言ってんだろ!
おむすび
な)だったらそう言ってくださいよ!
係)だからそう言ってんだろが!
な)だったら口だけじゃなくて、顔も「良い」顔してくださいよ!
係)どういうことだよ!
ったく、ホイップホイップうるさいんだよ!
な)だからー、係長の分のあんみつも買ってきますから〜
係)なんの「だから」なんだよ!
係長のワンポイント
偶数・奇数の判定は「処理を二つ作るため」のものじゃない。
本当は、両者の違いを見つけて処理を共通化するための判断材料だ。
よくある誤解は、REMAINDER で判定したあとに偶数用・奇数用のコードを丸ごと分けることだ。
それでも動くが、同じ処理が増えればコードは長くなり、修正する場所も増えていく。
だから違う部分だけを条件として残し、共通する流れは一つにまとめられないかを考える。
COBOLは分岐を増やす言語ではなく、違いを見極めて処理を整理する言語だ。


コメント