関数とは

関数。

数学で見た y = x みたいなやつ。

今回はこれについて考えていきます。

そもそも関数とは?

関数は、変換する装置のことをいいます。

例えば、同じ値段の商品を2個買ったらいくらになるかを知りたいとします。

2ko_nedan という関数を作るとしましょう。

2ko_nedan100円 と入れると、200円 が返ってくるようにしたい。

これを

払う金額 = 2ko_nedan(値段)

と表記することにします。

この場合、払う金額 には 200 が入っていてほしいわけです。

中身は自由

たぶん、この関数の中身は y = 2x (払う値段 = 2 × 値段) なのでしょう。

しかし、重要なのは、中身はどのように定義されていてもいいということです。意図したものが返ってくればいいわけですから。

なので、例えば中身が

4X / 2 + 100 - 100

みたいなものでも、結果が合っていれば問題ありません。(効率的ではないですけどね)

もっと汎用的に

「え? 2個だけとか限定的すぎるって?」

そうですよね。だったら、掛け算という関数を作りましょう。

わかりやすいように、kakezan(値段, 個数) とします。

中身はどうなるでしょうか?

y = 値段 × 個数

でしょうね。

関数の本質:隠蔽と信頼

ここで強調しておきたいのは、関数は変換してくれれば、その中身が何であれ別に問題がないということです。

そして、関数はその中身を見えないようにして、理解しやすいようにする機能を持っています。

一度中身を作ってしまえば、あとは、その関数に必要な値(引数)を渡したら、期待する値が返ってくる、と信じて使うことができます。

入力がない関数とAI

ここで、以下の関数を考えてみましょう。

pi()

これは円周率を返す関数です。渡す値はありません。

いったん中身を考えずに、この関数を呼び出したとします。すると 1 が返ってきました。

「円周率は 3.14... なので、全然違う!」

なので、この関数に「円周率はもう少し大きいよ」と教えてあげます。

そうすると次は 3 が返ってきました。

「もう少し大きいよ。」

と教えると、次は 4 が返ってきました。

「少し小さくして」というと、3.5 が返ってきました。

このように、目標値との違いをもとに、関数の中身を自動的にいい感じに変更してくれるものAI(人工知能)と呼ぶことがあります。

この過程は学習と呼ばれ、目標値との違い(誤差)をもとに、内部のパラメータ(関数の計算方法の一部)を変化させる仕組みを指します。

まとめ


ここから先は、読みたい人だけ(ちょっと深く掘る)

先ほどの掛け算関数をもう一度見てみましょう。

kakezan(値段, 個数) の中身は y = 値段 × 個数 でした。

しかし、よく考えると「掛け算」は「足し算」の繰り返しで表現できます。

なので、より基本的な操作で書くと、kakezan 関数は以下のように定義することもできます。


kakezan(値段, 個数):
  合計 = 0  // 合計を記録するものを用意
  個数 回繰り返す:
    合計 = 合計 + 値段 // 合計に値段を足す
  合計 を返す // 最終的な合計を関数の結果とする
            

ここでの「足し算」もまた、関数と考えることができます。1 + 1 の場合は 2 になる、1 + 2 の場合は 3 になる、といったルール(計算方法)が決まっているわけです。コンピュータ内部では、さらに基本的な回路(それも一種の関数)が足し算を実行しています。

このように、関数の中身は、たいていの場合、より小さな(基本的な)関数の集まりによって書かれることが多いです。

関数とは、

  1. 渡す値(入力)を決める
  2. 返してほしい値(出力)を決める
  3. 実際に返される値を信用して利用する

という考え方によって、複雑で高度な処理を実現するための非常に重要な仕組みなのです。