Entry

大人なんだから階乗を再帰で書くのはもうやめようね,という話

2010年04月07日

古本屋で『Code Complete』を見かけたので,買って読んでいます。それなりにプログラミングの経験を積んでいる向きにとって,新しく得るものは少ないかもしれないけれども,迷信じみたコーディング作法の根拠とそれに対する対応を考え直すにはいい本だと思います。

Code Complete第2版〈上〉―完全なプログラミングを目指して
スティーブ マコネル
日経BPソフトプレス
売り上げランキング: 31534
おすすめ度の平均: 4.5
5 10年分のスキルアップ
5 プログラマになるつもりなら、まず読もう
3 初心者に
5 入門書でありながら奥が深い
5 美しいコードを

一方,C++ であれ Java であれ C# であれ VB であれ,プログラミングを始めて「ようやく自分もそれなりに書けるようになったぜ」と思い始めた向きは,一読しておいた方がいいと思います。というのも,プログラミング言語の文法や構文を知っていることと,コーディングの作法を踏まえて,きれいで安全なコードを書けることは,まったく別の話だからです。美しくて丈夫なプログラムを構成するために,どのようなことに気をつければいいのか。あるいはどのような予防法/対策法が考えられるのか。本書では,ソフトウェエアエンジニアリングにおいて,これまで議論されてきたお題が網羅的に取り上げられています。

で,その中の一節から。

コンピュータサイエンスの教科書における問題の1つは、再帰のくだらない例を掲載していることである。よくあるのは、階乗の計算やフィボナッチ数列の計算だ。再帰は強力なツールであり、それをこのような状況で使用するとはあきれてものが言えない。仮に、私の部下が再帰を使って階乗を計算しようものなら、別のだれかを雇うだろう。

『Code Complete第2版〈上〉』(Steve McConnell,日経BPソフトプレス,2005年,p486)

以前,入社試験を考えたときに同じお題を出題したんですけれど(このサイトでも紹介している),単純なループで済むものをリスキーな再帰関数で書こうとする例はよくあります。今のところ,あたしが見た限りでは例にとどまっていて,世の中で動いているプログラムで見たことはありません。

いずれにしても,階乗を再帰で書くような例は,例示されているコード自体,セキュリティ的に危ういものを孕んでいる(スタックを使い果たす危険についておざなりになってる)し,再帰の適用場面についてもピンとこない場合が多いんじゃないだろうか。

再帰は,現在の処理と次の処理が処理的に相似の関係を保っている場合に適用できる手法で,大抵の場合 for-文や while-文で表現した方が分かりやすかったりします。多分木を走査する場合や,迷路探索のアルゴリズムでは,for-文等で書くと次の処理対象と現在の処理対象がひとつの関数に混在することになるから,再帰で書いた方が分かりやすくなるかもしれない。もちろん有名なクイックソートの場合もしかり。

まぁ,あたしもそんなに偉そうなことは言えないんですけれど,プログラマの精神的な成長って「初心者として謙虚な心境」から「難しげなことをちょっと知って得意になっている心境」を経て,「あえて難しい方法は採らない」ところに行き着くんだと思ったりします。そんなに再帰を使いたかったら,Lisp を使えばいいのに……とか思ったりもする。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN