Lepton先生のWeb上のコラム「闘わないプログラマ」。今週号の「宿題」。コンピュータネタ、目次へ
おかげさまで何故、プログラミングに数学的センスが必要か説明することが出来ました。どうもありがとう。
Lepton先生のコラムでは
「a**2+b*x+c=0という二次方程式」を解くプログラムを書けという宿題を出された学生さん(?)がネタでしたが、これは数学の問題としてもかなりの難問だったそうです。 1982年だったかに広島大学の入試問題として出て、とっても正答率が低かったという噂を耳にしました。ただし、問題はちょっと違って、
「a**2+b*x+c=0を解け」
でしたが。Lepton先生の見た学生は多分、これをプログラミングの問題と見たでしょう。ただし、それ以前に数学の問題として見なければなりません。
つまり、場合分けがいります。
a=0 かつ b=0 かつ c=0 の場合、解は不定。
a=0 かつ b=0 かつ c!=0 の場合、解なし。
a=0 かつ b!=0 の場合、x= -c/b。
この3つに気がつくかどうか、で頑強なプログラムが書けるかどうか決まります。
もちろん、入力チェックで「a,b,cは数値かどうか」を確認するというシステム仕様を追加するセンスは前提です。
たとえ「二次方程式」と限定されていたつもりでも、この程度のシステム仕様と場合分けを思いつかないと実務に耐えうる(=自分以外が使う)プログラムは書けません。ユーザーインターフェースをどうするかは次の問題。(俗な言い方をするとインターフェースのデザインは文系の人間の方が上手だったりする。)プログラミングのテクニックの教材として見た場合、複素数をどうやって表現するか、というのが焦点になるでしょうが、所詮は「マイナスのときは虚数単位を追加して出力する」だけの話。地道に考えればなんとかなるもの。(虚数一般をサポートしようとすると、虚数であるという状態をどこに持たせるかというのがオブジェクト指向を使わないとすると大変な問題になるが。)
センスとして必要なのは、高校に入って数学の答案の書き方が急に難しくなったとき、練習してなんとか書けるようになり、やがて[解]を一行ずつ書かないと落ち着かなくなってしまった、というその感覚なのです。