プログラミング基礎の基礎 No.002


論理的に話をしよう。

 論理的な話って?

「論理的に話をしよう。」と書いてしまうと、なにやら難しい事を言う様に思うかも知れないけど、
プログラムは計画書通りに動くだけだから、順序立てた話をしましょうよ。って事。

良いプログラムというのは、実に論理的で簡潔に書いてある。
プログラムを書くには「ロジック」と呼ばれる部分がとても重要になってくる。
辞書で[logic]を引いてみましょう、、、

log-ic,言葉の(log)学問(ic)
 1.論理学
 2.論理、論法、推理法;良識;道理、理屈、うむを言わせぬ力;
 3.必然性、不可抗力

こんな意味を持っている言葉で、プログラマー用語的な意味としては、
言語に依存しない考え方の事を指す。道理や必然性の意味が近いかな?

または、アルゴリズム[algorithm]とも呼ばれるね。
こちらはどんな意味か調べてみると、、、

al-go-rism,
 1.(1から9と0を用いる)アラビア式[十進]記数法。
 2.十進法による計算法;算術(arithmetic)
 3.=algorithm

al-go-rithm,
 演算法[方式];(一連の)算法、アルゴリズム。

情報処理の世界で言われる「アルゴリズム」は、ある問題に対して、
解くための手段を正確に定めたもので、数学の方程式みたいなものだな。

プログラムは言語を覚えなくては書けないけれど、本質の考え方というのは言語に依存しない。
プログラム言語の違いは、英語と独語と仏語位の違いでしかなくて、
単語や文法違うけれど、考えている事を伝える手段としては同じ目的を持っている。
例えば、英語の文章を書こうとするときに、英語の辞書を使うでしょ?
書く内容が既に決まっていて、それを表現するために使っているはず。
プログラム言語も同じ処理をさせる目的に対して、無数の表現方法がある。
表現する事は辞書を使いながら出来るから良いプログラムを書くためには、
ロジックの部分がいかに重要かがわかるでしょう。。。

 実は本質的な事とは

本質的な事とは、実は日常で使っている場合が多い。
僕がまだプログラマーになったばかりの頃に感じた事だけど。

例えば、12色入りの色鉛筆がケースにバラバラに入っていたら、順番に並べようと思うよね?
並べる為には、皆さんはどうしますか?

すべてケースの外に出して端から並べる。
このやり方が一番わかりやすいね。
だけど、すべてをケースから出してしまったらどこかに置いたり、手に持ちながら作業する。
何本もケースから出してしまうと、探すのに時間かかるしね。

では、少し条件を付けてみよう。
左手には1本までしか持ちたくない。

この条件だと、2本を交換すると言うことになるよね?
だけど、このやり方の時、12色入りでそれぞれどこに置くか分かっているときは、
並べ替えるのも簡単だけど、48色入りで、並べたときに綺麗なグラデーションになるように、
置きたい場合は?

置き換える色鉛筆を、端から順番に置き換えるとわかりやすいよね。
ではその場合、何回交換する作業を繰り返すのだろう???
高校数学の確率・統計の話だな。
最大、12色なら11回、48色なら47回の置き換えが必要になる。

このやり方は実はちょっと複雑で、端から順番に見たときに次に来るものを探さなくてはいけない。
48色位なら、まだ全体を見渡せるけど、1万色とかになってしまったら???(笑)
微妙な色の違いを2つ並べれば何とか分かるかも知れないね。

もう一つだけ条件を加えよう。
隣合わせの色鉛筆しか交換できない。
一つずつしか移動出来ないという事だね。

この場合、置き換えの回数は、最大12色で、
(11+10+9+8+7+6+5+4+3+2+1)=66回になると思う。

色鉛筆でちょっと試してみよう。結構楽しいかも。

 バブルソート

上の方法のことを、通称バブルソートと呼ぶ。(最大66回の方法ね)
ケースを配列、色鉛筆を値、色を順番に並べるのが条件文だね。
配列の最初から最後までのループの中で、iとi+1の隣合わせの値を比較して、
その大小関係で置き換える。その動作を置き換えが無くなるまで繰り返す方法。
あまり効率の良くない方法だけど、一番わかりやすい方法。

 セレクションソート

上記の11回の方法。端から順に整列していないデータの中から、
最大(最小)値を探し出して置き換える方法。
バブルソートに比べて「探し出す」分だけ無駄な条件文が少なくなるが、
それでもまだ効率が悪い。僕が一番よく使う方法だな。

簡単で基本的なソート方法。

 良いロジックとは。

基本的なソート方法を書いたけれど、ここまではちょっと考えれば誰でも出来そうだね。
その他には、挿入ソート、クイックソート、マージソートといろんな手法があるけれど、
そっちの方にも興味がある人は、情報処理第2種試験の教科書を買ってきて勉強してみよう!

良いロジックとは、処理量が少なく、かつ、メモリ消費量の少ない手法。
世の中には、想像もつかないような天才がいるから、そういった人達が考え出したロジックを
機会があったら読んでみて勉強してみましょう。

 考え方は重要。

結局のところ、良いプログラムを書くには、無駄の少ない良いロジックで書くと言うこと。
条件文が少なければ、速く処理することが出来るし、
使用する変数が少なければ、メモリへのアクセスが減り、これもまた速さにつながる。

今のパソコンは昔に比べて、多少の事でも遅くは感じないかも知れないけど、
どうせなら効率の良いプログラムを書きたいね。目的が同じならさ。

極端な話、例えば条件文が1行で0.1秒かかったとしたら、、、
10回のループ(繰り返し)で1秒。これは大したこと無い気がするけど、
もし、10000回のループなら!?

簡潔に無駄の少ないプログラム。
良いプログラムを書きたいのなら、論理的に計画立ててから書き始めましょう。

 戻る...