← メディア一覧

間違い探しシリーズ:終わらない悪夢:無限ループと変数の更新

5分33秒 | アルゴリズム科目BデバッグFE

基本情報技術者試験の頻出テーマを解説した動画コンテンツです。

トランスクリプト(字幕テキスト)

1です、1です、1です。ねえ、聞こえますか?このどこまでも続く声。 さて、今回の解説では、ある新人プログラマーを襲った本当に怖い話、 無限ループっていう悪夢の謎、皆さんと一緒に解き明かしていきたいと思います。 この物語は、新人開発者のカイ君の悲鳴から、そう始まるんです。 彼が一生懸命書いたプログラムが、突然言うことを聞かなくなった。 画面にはね、もう1っていう数字が滝みたいに流れてて、全然止まる気配がない。 彼の頭の中、今頃きっと真っ白でしょうね。 そんなカイ君の悲鳴を聞きつけて、スッと現れた一人の先輩がいるんです。彼女の名前はアキさん。 どんなに複雑に絡まったコードも、まるで魔法みたいに解きほぐしちゃう、まあチームの守護神みたいな人ですね。 彼女、カイ君の画面をチラッと見ただけで、もうその悪夢の正体をピタリと見抜いちゃうんですよ。 アキ先輩はね、静かに、でもはっきりとこう言ったんです。「あらあら、無限ループの迷宮に迷い込んじゃったみたいね。 一度入ったらもう二度と抜け出せない、出口のないトンネルよ」って。 そう、これこそがプログラムの中に潜む終わることのない悪夢の正体なんです。 さて、こちらがその事件現場となったコードです。どうですか?パッと見どこが問題なのか、ちょっとわかりにくいですよね。 iが5以下の間、iを表示し続ける。うん、すごくシンプルです。でも、あれ? 何かが、何か決定的なものが見落とされているような、そんな気がしませんか? そう、それこそがカイ君を絶望の淵に叩き落としたこの悪魔の核心部分なんです。 ここでアキ先輩が、まるで私たちに挑戦するかのように問いかけます。 このコードの中に、カイ君が見つけられなかったたった一つの、脱出への鍵が隠されている、と。 さあ皆さま、この謎、解き明かせますか?一緒に真実を、探しに行きましょうよ。 おっと、ここでアキ先輩から核心に迫る大きなヒントが出ました。バグはどこかって?ヒントはね、iの気持ちになってみることよ。 変数の気持ち?ですか?ちょっと不思議に聞こえるかもしれないですけど、この変数iが今どんな状況にいるのか、 それを想像することが解決へのたった一つの道筋なんですね。 さあ、ついに核心が見えてきましたよ。このコードの致命的な欠陥、それは、変数iがずっと1のままだったっていうことなんです。 ループを続ける条件は、iが5以下であること。iがずっと1だったら、この条件っていつまでたっても、そう、未来永劫満たされちゃうわけです。 つまり、このループにはそもそも出口なんて存在しなかったんですよ。この状況って、まるで回し車の中をひたすら走るハムスターみたいだと思いませんか? whileループっていう名前の回し車の中で、カイ君は必死に走ってる。でも、いくら走っても一歩も前に進んでいない。 ゴールであるiが6になるっていう状態には永遠に絶対にたどり着けないんです。これこそが無限ループの恐ろしさなんですね。 じゃあなんでこんなことが起きちゃうんでしょう。アキ先輩はこう続けます。 カイ君、似たような繰り返し処理でforループってあるでしょう?あれはね、自動で一歩ずつ前に進んでくれる、すごく親切な設計なの。 でも、今君が使っているwhileループは、自分で一歩進めって命令してあげないと永遠にその場から動かないのよ。 これがね、多くの初心者がハマっちゃう罠なの、と。 そしてついに、アキ先輩が謎の答えを明かします。カイ君が書き忘れてしまったたった一つの、脱出への鍵。 その正体は、そう、「iを増やす処理(インクリメント)がない」こと。原因は本当にたったそれだけの事だったんです。 こちらが悪夢のコードと、それを打ち破る希望のコードです。みてください、右側に追加された i = i + 1。 このたった一行こそが無限地獄からカイ君を救い出す命綱だったわけです。この魔法の一行があるおかげで、 iは1、2、3、4、5って着実にゴールへの階段を登って、やがて6になる。そしてループっていう悪夢に、ついに終わりを告げるんです。 アキ先輩が教えてくれたこの教訓、プログラマーの黄金ルールとしてぜひ心に刻んでおきましょう。 ステップ1、whileの条件を書く。そしてステップ2、すぐに、もう間髪入れずに、ループを終わらせるための変数の更新処理を書く。 これをもう指が覚えるくらい手癖にしちゃえば、二度とカイ君みたいな悪夢を見ることはなくなるはずです。 無事に悪夢から解放されたカイ君、ぽつりとこう言いました。「止まらないプログラムって、マジで心臓に悪いですよ…」。 いや、この言葉、多くのプログラマーが分かるって深く頷いてるんじゃないでしょうか。自分の書いたコードが制御不能になるあの感覚、本当に怖いですからね。 たった一行が天国と地獄を分けることもあるんですね。今回の物語で見てきたように、たった一行の書き忘れがプログラムを終わらない悪夢に変えてしまいました。 じゃあ、これ以外にどんな「たった一つの打ち間違い」が大惨事を引き起こすと思いますか? その答えを探す旅は、まだ始まったばかりです。ぜひこれからもその探求を続けてみて下さいね。

このコンテンツは Web society で視聴・学習できます。