間違い探しシリーズ:アルゴリズム・ミステリー:消えた最大値の謎
4分32秒 | アルゴリズム基礎FE
基本情報技術者試験の頻出テーマを解説した動画コンテンツです。
トランスクリプト(字幕テキスト)
さあ皆さん、こんにちは。今回はですね、見た目はもう完璧なはずのコードに隠された、ちょっとしたミステリーに挑戦してもらいたいと思います。 言わばバグ探しの時間ってわけですね。一緒にこの謎、解き明かしていきましょう。 で、このコードを書いたのが、新人プログラマーのカイくんなんですけどね。もう、彼のこの悲痛な叫び。これがね、今回の問題の全てを物語ってるんですよ。 「完璧なはずなのに」って。いやあ、これコード書く人なら一度は経験ありますよね。絶対あるはず。 さあじゃあ、早速問題のコードを見ていきましょうか。これ何をしているかっていうと、配列の中から一番大きい値、 つまり最大値を見つけ出すっていう、まあ、ごくごくシンプルなアルゴリズムなんですよね。ええと、まずMaxっていう変数に、配列の最初の値を入れて、 でループで配列の要素を一個ずつ見ていくと。でもって、もしMaxより大きい値が見つかったら、そのたびにMaxの値をこう上書きしていくわけですね。 うーん、ロジック自体はパッと見全然正しそうに見えますけどねえ。 と、そこへ登場するのが、先輩プログラマーのアキさんです。彼女が言うようにね、これって別に、カイくんのミスを責めようって話じゃなくて、 僕ら全員への挑戦状みたいなもんなんですよね。さあ皆さん、準備はいいですか? じゃあ行きましょうか。皆さんも一緒に考えてみてください。このコードの一体どこに間違いが隠れてるんでしょうかね。 一個ずつよく見ていきましょう。 はい、じゃあここから10秒間、シンキングタイムです。ぜひね、このあたりで一旦止めて、じっくり考えてみてください。 答えはこれだって分かった人も、うーん、ここが怪しいかなって人も、自分なりの仮説を立ててみるのが大事ですよ。さあ、どうぞ。 はい、そこまで。時間切れです。さあ正解はここでした。ループの終了条件、 データの要素数マイナス一って書いてある部分。いやあ見つけられた方、お見事です。じゃあ一体なぜここが問題なのか、詳しく見ていきましょうか。 もうこの画面を見てもらえれば一発ですね。カイくんのコードだとループは1から始まってますよね。で、このコード、例えば配列の要素が5個あったとしたら、 添字もまあ1から5まであるとしましょうか。ところが、ループの終わりの条件が要素数マイナス一、つまり4までになっちゃってるんで、 ループがチェックするのは1、2、3、4番目の要素だけ。結果として一番最後のデータの5番目が完全にスルーされちゃってたわけですね。 ああ、なるほど。そういうことか。こういう風にループの始まりとか終わりで、ちょうど一個だけずれちゃうっていうミス。これ、「境界値の罠」って言うんですよ。 もうね、プログラミングやってると本当によく出くわす、まあ定番の落とし穴なんです。この言葉ぜひ覚えておくといいですよ。 でその動きを見える化したのが、このトレース表ってやつですね。コンピューターの気持ちになって変数がどう動くかを一挙ずつ追いかけていくと、 ほら、見てください。iが4のチェックを終えた時点でループが終わっちゃう。最後のデータ5の2にはもう永遠にたどり着けない。 これがバグの正体だったわけです。こうやって見ると一目瞭然ですよね。 さてさて、今回の謎はこれで一件落着ですけど、本当に大事なのはここからです。僕らが本当に学ぶべきことって、この一個のバグの知識、それだけじゃないんです。 そうじゃなくて、どんなバグにだって立ち向かえるそのスキル、そのものなんですよね。 でその最強のスキルっていうのが、さっきも出てきたトレースなんです。まさに「急がば回れ」でね、 ただパソコンの画面をじっと睨んでるだけじゃなくて、実際に手を動かして変数がどう変わっていくのかを一つ一つ書き出していく。 この地味な作業こそが、どんなに複雑なバグでも見つけ出す、一番確実な方法なんです。 最後にアキさんからもう一言アドバイスです。「コードのトレース、忘れないでね」と。これこそがバグ探しの最強の武器になるんです。 次に皆さんが「あれ、コードが思った通りに動かないぞ」ってなった時、ぜひこのトレースっていう武器を思い出してください。きっと皆さんのバグ探しの旅が今日から少し楽になるはずです。
このコンテンツは Web society で視聴・学習できます。