問題:規則を見つけ、当てはまる数字を答えなさい。
※春日部共栄中学(改)
番組では、数字を捕まえ「虫かご」に入れると……と、マス北野が説明していたのだけれど、「Black Box」に変更。数字をドラッグして、箱(ブラックボックス)へドロップすると、数字が変わる。その法則を見つけ、「10」を箱へ入れたとき、いくつになるかを考えてね。
日能研に通う小学生の61%が正解した問題。番組では、磯野くん以外、全員が正解した^^;
規則を見つけるときは、差に注目。
[2]=[1]+2
[3]=[2]+3
[4]=[3]+4
[1]=1なので、
[2]=1+2
同様に箱の中身を見ていくと、
[3]=1+2+3
[4]=1+2+3+4
……というように、箱は、1から、その数までの自然数をすべて足した数に変換していたんだね。
だから、10を箱に入れると、答えは……
[10]=1+2+3+4+5+6+7+8+9+10
[10]=55
中学校へ行くと「関数」を習う。関数は、今回の問題のように何かを入力すると、何かを出力する箱のようなもの。英語では「function」というが、これが中国に伝わって「函数(ファンスウ)」になったらしい。日本では、そのまま中国から伝わった「函数(かんすう)」という言葉を使っていたが、教育漢字の制限で「関数」が使われるようになった。「手紙をポストに投函する」といったように、「函」は「箱」という意味。(えっ、昔のポストは、赤い円柱だったから、箱じゃないって? 細かいことは気にしない^^;)
中学で習う、一次関数や二次関数と、エクセルなどで使う関数は別のものだと思っている人がいるみたいだ。「y=2x+3」の一次方程式に、具体的な「x」の値を入力すれば、「y」の値を出力する。これは、エクセルなどで「=GCD(33,44,55)」と入力すれば、「33、44、55」の最大公約数を出力するのと同じ。もっと言えば、円の面積を求める「S=πr^2」などの公式(文字式)も、半径(r)の値を入力すれば、円の面積を出力する点で、ひとつの関数とも言える(と、爺は思う)。
エクセルで円周率を求めるには「=PI()」とすれば、「3.141592654」と求めることができるが、自分で計算して円周率を求めることのできる人は少ないだろう。いわば、関数は、ブラック・ボックス(中身が見えない箱)として、だけど、中身は気にせず、結果を受け取ることのできる、とても便利な箱として使っているわけだ。
閑話休題。今回の問題は、ある数を入力したら、1からその数までの自然数をぜんぶ足し合わせる……という機能を持った箱を作ればよい。関数は、「function」の頭文字をとって「y=f(x)」のように表す。
f(n)=(1+2+3……+n)
Flashで、この機能を実現すると、以下のようになる。
function BlackBox(n:Number) {
answer = 0;
for(i=1; i<n+1; i++) {
answer += i;
}
return answer;
}
左の入力欄をダブルクリックして、数値を入力し、ボタンを押してほしい。「BlackBox」という関数に入力した数値「n」を渡すと、答えが返ってくる。まぁ、わかり易いと言えば、わかり易いが、あまりにもストレートすぎる。この方法だと「100000」と入力すると、10万回のループを実行しないと答えが出ない。「1000000」では、答えが出るまで数秒かかってしまう><;
そこで、ガウスの少年時代の逸話に習って、もう少し計算方法を工夫してみる。
function BlackBox(n:Number) {
c = 0;
if (n%2 <> 0) {
c = (n+1)/2;
}
a = n+1;
b = Math.floor(a/2);
answer = a * b – c;
return answer;
}
たとえば、1~10までの数なら、始めの「1」と終わりの「10」を足して「11」、次に「2」と「9」を足して「11」というように、この組み合わせがいくつできるかを考える。1~10までの数なら、5組できるので、11×5で55だ。「n」が奇数の場合は、ペアにならない数が真ん中にできるので、その処理も加える。
……というわけで「10000000」までなら、一瞬で答えが出せるようになった^^; これ以上になると、答えが倍精度で表すことのできる範囲を超えてしまう。
「だから何?」って感じだが、う~む、いったい、爺は何をしたいのだろう^^; 究極の暇つぶし?
≪追記:8月6日≫
爺は、なんて、めんどくさいことをしていたのだろう^^; 等差数列の和の公式を思い出せば、一行で書けたのだ;;
function BlackBox(n:Number) {
answer = n * (n+1)/2;
return answer;
}
もうひと息でした。残念><;
Flash では再起呼び出しは出来ないんですか?
☆○さん、コメントありがとうございます。
Flashでも再帰呼び出しは、できますが、それ以前の問題として、1~nまでの総和は、
f(n)=n*(n+1)/2
で表すことができるのでした><;