22 / 2781%

LESSON 22 ・ 関数

高階関数

関数を引数に渡す

function square(x) {
  return x * x;
}

let a = twice(square, 3);
console.log(a);

関数の引数に関数を渡すこともできます。

たとえば、同じ関数を2回繰り返して実行する関数twiceを考えます。そうすると、twiceに繰り返したい関数squareを渡したくなるはずです。これが、関数に関数を渡すという意味です。

上記の例では、まずsquare(3)3 * 3が実行されて9が得られ、さらにsquare(9)9 * 9が実行されて81が得られます。

このように、関数を引数として受け取る、または関数を戻り値として返す関数を高階関数(こうかいかんすう, higher-order function)と言います。

高階関数を実装する

function twice(f, x) {
  let y = f(x);
  let z = f(y);
  return z;
}

function square(x) {
  return x * x;
}

let a = twice(square, 3);
console.log(a);

関数twiceはこのように実装できます。

function twice(f, x) {
  return f(f(x));
}

function square(x) {
  return x * x;
}

let a = twice(square, 3);
console.log(a);

より簡潔に書くこともできます。

PRACTICE

演習問題

コードを自分で書いて実行してから、答えと解説を確認しましょう。

問題1

受け取った関数を2回適用する高階関数twiceと、整数を2乗する関数squareを定義してください。twice(square, 3)の結果を表示してください。

答えと解説を見る

模範解答

function twice(f, x) {
  return f(f(x));
}

function square(x) {
  return x * x;
}

console.log(twice(square, 3));

twiceは関数fを引数として受け取り、その関数を2回呼び出します。3を2乗した9がもう一度2乗されるため、81が表示されます。

問題2

受け取った整数を1増やす関数addOneと、受け取った関数を2回適用する高階関数twiceを定義してください。twice(addOne, 3)の結果を表示してください。

答えと解説を見る

模範解答

function twice(f, x) {
  return f(f(x));
}

function addOne(x) {
  return x + 1;
}

console.log(twice(addOne, 3));

最初のaddOne34になり、次のaddOne5になります。関数を引数として渡すことで、twiceは異なる関数にも使えます。

問題3

受け取った関数を3回適用する高階関数thriceを定義してください。addOneを渡して、thrice(addOne, 10)の結果を表示してください。

答えと解説を見る

模範解答

function thrice(f, x) {
  return f(f(f(x)));
}

function addOne(x) {
  return x + 1;
}

console.log(thrice(addOne, 10));

fの戻り値を次のfへ渡す処理を3回重ねます。101が3回足され、13が表示されます。