このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

掛け算の順序問題: 「またプログラマーか!」と言われてる

KuwataさんのTwitter経由で知った https://twitter.com/genkuroki/status/1145698996033167360/ に貼ってあったスクリーンショット画像。

"AtheOS@技術者育成中(進行形)"さんが返信で言いたいことは、おそらく:

for (int j = 0; j < 5; j++) {
  for (int i = 0; i < 4; i++) {
    なにか;
  }
}
for (int j = 0; j < 4; j++) {
  for (int i = 0; i < 5; i++) {
    なにか;
  }
}

「上の2つのコードで表現される処理は違うよ」ってことでしょう。それ自体はまったく正しいことです。上記2つのコードの実行は、違った処理過程になりますし、処理結果も違うかも知れません(同じときもあります)。

しかし、それを根拠に「5×4 と 4×5 を区別するよう教育せよ」と主張しているところが、理解しがたい*1

ここで断っておきますが、「5×4 と 4×5 を区別せよ」論者に対して、懇切な説明や説得を試みる気はありません。「5×4 と 4×5 を区別せよ」を本気で主張している人を説得できる可能性は低いでしょう。説得可能だとしても、とても労力がかかるでしょう。-- 不毛。

感じたこと/思ったことをパラパラと書くだけです。

まず、“順序区別論者”に対して「交換法則があるでしょ」と言っても意味ないですね。「掛け算の順序を区別せよ」と言ってるだけで、交換法則を否定してるわけじゃないですから。

「5個/袋 × 4袋」と「4個/袋 × 5袋」は違うとか、「5km/時間 × 4時間」と「4km/時間 × 5時間」は違うとかが、背後にある状況が違うでしょ、ってことならその通りで異論はないです。むしろ、背後にある状況の違いはシッカリ認識すべきだと思います。

4回の繰り返し(内側ループ)を5回繰り返す(外側ループ)と、5回の繰り返し(内側ループ)を4回繰り返す(外側ループ)も、背後にある状況(繰り返し処理の構造と挙動)は違います -- 異論はないです

で、そのような背後にある状況の違いを、表記上も違う書き方をすると約束して守らせたいの? そこが分からん! …… (しばらく自分で考えてみた) 背後にある状況の違いを認識しているかどうかを確認するために、ローカル・ルールを設ける、って話かな? 必要なのかぁ、そんなこと。

それと、掛け算ばっかりやり玉に挙げるけど、足し算は放置でいいの? 指を折る“数え足し”を考えると、4 + 5 と 5 + 4 は違います。

  1. 最初に指を4本折る、次に指を5本折る。
  2. 最初に指を5本折る、次に指を4本折る。

この2つは、違った処理過程(手順の遂行過程)になります。足し算の順序も「徹底するようにして下さい」ってならないの?

*1:もっと正直に言うと; おまえ何考えてんだよ!? どうかしてんだろ。