++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Archive for 7月 2012

多項式計算

leave a comment »

そうそう、さっきの話の余談。

64x7-112x5+56x3-7x

という式をプログラム化しなさいというような問題も出したときの話。

まあ、べたに

まずは素直に。

var y = 64 * x * x * x * x * x * x * x – 112 * x * x * x * x * x + 56 * x * x * x – 7 * x;

そもそもこれを自力で書ける人がそんなにいなかったり。

できない人は、「* x」の数を間違えてるとかそういう話ではなくて、「64x」と書いちゃうとか「* が多い/少ない」とか、「どこから出てきたのか、x以外の文字を書く」とかが8割くらい。

残りの2割はいわゆる「白紙回答」。何もしない。「わかりません」と言える人はまだ平気な方で、こちらから「大丈夫?」って聞いても応答なしなことすらあり。

長いコードを書きたくないです

と言って「べき乗関数はないんですか?」と聞いてくる人は5%くらいかなぁ。

そういう人には、まあ、「一応、Math.Powってのがあるんだけども、演算量的に、整数べきに使うものじゃないよ。」とか教えつつ、以下のようなコードが出てきます。

var y = 64 * Math.Pow(x, 7) – 112 * Math.Pow(x, 5) + 56 * Math.Pow(x, 3) – 7 * x;

確かにすっきりはするし、「* x」の数を間違えたりはしないのだけども… 数十倍遅くなるからなぁ…

この手のコードの定石

ごくまれに、以下のようなコードを書いてくれる人あり。

var y = (((64 * x * x – 112) * x * x + 56) * x * x – 7) * x;

「一般的に、多項式を計算するときはカッコでくくって掛け算を減らす」という定石を知ってる人。元のべた書きよりも数割高速なはず。こういう定石も教えておいた方がいいなぁと思った瞬間。

まあ、自分なら一時変数作っちゃいますが。

var x2 = x * x;
var x3 = x * x2;
var x5 = x3 * x2;
var x7 = x5 * x2;
var y = 64 * x7 – 112 * x5 + 56 * x3 – 7 * x;

この式の場合は奇数次の項しかないので、「* x * x」じゃなくて「* x2」するのもポイント(このくらいなら大抵はコンパイラが最適化してくれますが)。

広告

Written by ufcpp

2012年7月8日 at 15:48

カテゴリー: 未分類

穴埋め問題

with one comment

いきなりですが、問題。

問題

  • 掛け算には * (アスタリスク)という記号を使います
  • sin 関数は Math.Sin という書き方をします
  • 関数のパラメーターは() (中かっこ)で覆います

以下の表の ? の部分を埋めなさい。

image

解けない人

結構びっくりする人が多いんですが、こういう類の穴埋めができない人ってのがかなりいます。

たぶん、できる人の場合、理系とか文系とか関係なく、数学もプログラミングも両方知らなくても、なんとなく答えがわかるはず。これは結局、数学やプログラミングの問題じゃなくて、類似性とか一貫性とかを見つける能力なので。(あるいは、必ずしも正解でなくても、間違うにしても一貫した間違い方する人と、ほんとバラバラの間違い方する人に分かれます。一貫した間違い方をする人は、数問訂正するだけで正解にたどり着きます。)

で、できない人は、どれだけサンプル(表のx2の列とかの)を増やしても、別の何か(2x2とか)を見せられると「これは初めてみるから解き方がわからない」となります。類推が効かない。

徹底して、類推が効かない

「数学が苦手」とか「プログラミングが苦手」って言ってる人って、実のところ、かなりの割合、こういう類推のできないタイプなのではないかと。実際の問題は、数学やプログラミングができないんじゃなくて、もっと根本のところの問題だったり。

類推ができないっていうのは、極端な話、Wordで保存の仕方を覚えても、Excelでは保存ができない。次に、また頑張ってExcelの保存の仕方を覚えても、ペイントでは保存ができない(「習ってない」と言う)。(これも実際にそういう人を見たことがある。)

こんな研究もあって

この「できる人」の話に関連して、結構有名な話があります。それの説明が以下の記事に。

一貫性を類推できる人とできない人ってのがいて、できる人の側はプログラミングの授業の成績がよい(結構高い相関を示す)という内容。

そのできる人とできない人の比率も出てて、上記のページから引用すると…

  • 学生の44%は代入がどのように働くかについて一貫したモデルを持つに至る(たとえ正しくなくとも)
  • 39%の学生は代入のモデルとして一貫したものを形成できない。
  • 8%の学生はふてくされて回答を空白のままにする。

だそうです。半々(サンプル数があんまり多くないので、一般論として語れる数字ではないですが)。

しかも、何かを教えだす前からすでに、結果がある程度見えているという。

「できない」を想像する・「できない」を認める

結局何が言いたいかというと、人に何かを教えるというときには、思った以上にいろいろと考えておかないといけないわけです。

  • 「○○ができない」という人には、本当はその○○について教えてもダメなことがある
    • もっと根本の問題を探らないといけないことがある
  • どうあがいても、どうしようもなく「できない」ことがある
    • できない前提で、何か別の手を考えないといけないことがある

この辺りの「できない」を想像できない人、根本的に「できない」ものがあるというのを認められない人が結構いて、そういう人は案の定、教育に失敗してるなぁとか思うこともしばしば。

Written by ufcpp

2012年7月8日 at 14:48

カテゴリー: 未分類