見出し画像

数学の「関数」とプログラミングの「関数」

 「関数」を和英辞典で引くと function。function を英和辞典で引くと、最初にかかれているのは「機能」である。つまり、「関数」とは「機能」のこと。

 「関数」が分かりにくいのは、漢字「関」にある、という説もある。この「関」から「関係」の「関」を連想するならば、「xとyの関係を表すのが関数」だと思いかねない。
 「関数」のもとの字は「函数」。「函」は箱だから、ブラックボックスのようなものだ、と説明する人もいる。
 function を読むと、ファンクション。これが ファンシュー に近いので、中国で「函数」と表された、という、うそかほんとかわからない説もある。
 ともかく、「函」の字は、常用漢字から外れたので、教科書で使えないから「関数」にしたといわれる。

 というような話をどこかで聞いただろうか。中学か高校時代の数学の授業で。
筆者は1年生の数学で必ずこの話をして、「関数」の意味は「機能」だ、と言っているが、果たして、どのくらいの教員がこの話・いや中国語の話はどうでもよくて、関数は機能だ、という話・をしているだろう。

 いま書いている「高校教員のためのPython Reference」に、コラムとしてこのことを書いた。

「関数」の意味
 数学では中学校で「関数」を学ぶ。しかし、関数の意味がわかって高校に進学してくるかというと、若干怪しいところがある。中学で使うのはごく簡単な2次関数と1次関数だけだ。これらを、固有名詞的に「関数」と思っている可能性が大きい。
 高校の数学Iの教科書には、「2つの変数 𝑥, 𝑦 があって、𝑥 の値を定めるとそれに応じて 𝑦 の値がただ1つだけ定まるとき、𝑦 は 𝑥 の関数であるという。」と、やや限定的な書き方をしている。
 しかし、「関数」の本当の意味は「機能」である。「function」を和英辞典で引いてみるとよい。プログラミングにおいても、「関数」とは「機能」なのである。
 プログラミングの学習を通して、「関数」の意味をつかむ、というのもよいかもしれない。

以前も書いたが、文科省の研修用資料には次のように書かれている。

一般にシステム開発などで行われるプログラムは大規模なので,コードの長さも膨大となる。このような場合, 文章の章,節,段落のような適切な構造を作らないと,コードの可読性は著しく低くなってしまう。 そこでプログラムの機能ごとにメインコードから切り離し,関数という単位で分割することで,プログラムを 機能ごとに整理,構造化することが可能となる。また,作成した関数はメインコード内で何回でも呼び出すことが可能となるため,作成した機能を再利用することが可能となる。

この中には、ちゃんと「機能」という言葉が使われている。しかし、前の記事では引用しなかったが、その次にはこう書かれている。

 数学での関数は y=f(x) のように表現されるが,コンピュータプログラムの関数では x を引数(ひきすう),y を 戻り値と呼んでいる。(図表6参照)
 実際に関数で分割するときには「どのような処理を行っているか」と同時に,引数(処理に必要なデータは何 であるか),戻り値(処理結果のデータは何であるか)を把握する必要がある。(図表7参照)

画像1

 なぜ、「数学における関数」と「プログラムにおける関数」を分ける必要があるのだろうか。分けているつもりはないかもしれないが,これでは、「数学でいう関数と、プログラミングでいう関数は別なものだ」という誤解を生みかねない。(一応、これを書いた人は誤解はしていないと思っておきたい)
 数学だろうが、プログラミングだろうが、「関数」の意味は「機能」で、同じことなのだ。

 しかし、その先を読むと、どうやら、これを書いた人な何か誤解をしているのではないかと思わざるを得ないものが書いてある。

画像2

「関数で分割」だ。始めの文に、確かに「そこでプログラムの機能ごとにメインコードから切り離し,関数という単位で分割する」と書いてある。

 しかし、これでは、「組み込み関数」が何なのかの説明がつかない。組み込み関数を使うというのは、プログラムを分割しているわけではないだろう。自分が書いているプログラムの中である機能が欲しいときに、それが組み込み関数として用意されているから使うのだ。

 演習3 の問題文にはこう書かれている。

画像3

「関数」は「機能」であることがちゃんとわかっているのならば、次のような問題文にすべきだろう。

 上の図表9のコードを参考にして、「指定した回数p回、2を加算する」機能を持った関数を作り、それを利用したプログラムを書いてください。なお、引数は「繰り返す回数p」、戻り値は「加算した結果」としてください。


 4月からの2021年度、高等学校審学習指導要領の移行期間に入る。Web上には、高校向けのPython教室の案内やら記事やらがだいぶ出てきた。プログラミングスクールで、関数の概念についてどのくらいちゃんと教えられるだろうか。

 最近出たものに、「高校情報科・情報処理技術者試験対策の突破口ドットコム」さんの記事がある。YouTubeでの解説と、それを文字起こしした note のセットになっている。

その中の「関数」の回では、次のような説明になっている。

関数は とある処理を行う命令のまとまりを ブロックに書いてまとめたものなんだ

「機能」という言葉は使っていないが、まあよいだろう。プログラムを分割したものではない。そのあとの例も、まさに関数の使い方になっている。
 他の回もすべて見たが、丁寧なわかりやすい説明で、YouTubeを見ながら高校生が学ぶにはとてもよいものだと思う。YouTube 上には、算数・数学でも粗悪なものもあるから要注意だ。これからどんどん増えていくだろう。生徒が粗悪品をつかまされる前に、教員がチェックして注意喚起する必要も、これからは出てくるかもしれない。いや到底チェックはしきれないから、生徒にどんなもの見たか報告させてもよいだろう。となると、善し悪しを判定するだけの力量が教員に必要になってくるわけだ。ほ〜ら、大変だよ。早くから準備しないと。