関数

この章では、javascriptにおいて関数を定義し、プログラミングした処理を再利用する方法について紹介します。

関数の定義

関数とは、数学で使うy = f(x)のことです。 基本的な文法はこうです。

function 関数名(引数) {
  処理したい内容
  処理したい内容
  ......
  return 返り値
}

例として二次関数y = xの2乗を書いてみましょう。

function f(x) {
  return x * x
}

for (var x = 1; x <= 10; x++) {
  console.log(
    "f(" + x + ") = " + f(x)
  )
}

実行結果は次のようになります。

二次関数の実行結果

関数を定義することにより、プログラミングした処理を再利用することができるので、生産性が劇的に向上します。

実際にソフトウェアを作る際には、すでに他の人が書いて公開してくれているライブラリ(プログラムの部品)を読み込み、ライブラリ中で定義されている関数を組み合わせて目的のソフトウェアを作ることがほとんどです。

ちなみに先程から出力に使っているconsole.logも関数の一つです。

関数の組み合わせ

ある関数のなかから別の関数を呼び出すこともできます。 例えば

  • f(x) = xの2乗
  • g(x) = xの3乗
  • h(x) = f(x) + g(x)

みたいなケースは次のように書くことができます。

function f(x) {
  return x * x
}

function g(x) {
  return x * x * x
}

function h(x) {
  return f(x) + g(x)
}

再帰呼び出し

関数は自身と同じ関数を呼び出すことができます。 このような呼び出しを再帰といいます。 少し言葉では説明しづらいので、フィボナッチ数を求めるコードを書いてみましょう。

フィボナッチ数の定義は次の通りです。

  • 第1項: 1
  • 第2項: 1
  • 第n項: 第n-1項 + 第n-2項

数列としては1, 1, 2, 3, 5, 8, 13, 21, ...です。 コードは次のようになります。

function fib(n) {
  if (n == 1) return 1
  if (n == 2) return 1
  return fib(n-1) + fib(n-2)
}

定義どおりのきれいなコードですね。 処理中にreturnが現れると残りは実行せず関数を抜けるため、この場合if-elseを書く必要はありません。

試しに第1項〜第10項まで計算してみます。

for (let i = 1; i <= 10; i++) {
  console.log(
    "fib(" + i + ") = " + fib(i)
  )
}

実行結果は次のようになります。

フィボナッチ数列

あっていますね。

© 2018 set0gut1