logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll

PHP レッスン — レッスン 9 — 再帰

08/12/2019, by Ivan

前のレッスンでは、PHP での関数の使い方を見ました。では、その使い方をもう少し深く掘り下げます。このレッスンまで、私たちは次のような形の関数を見てきました:

<?php
function myFunction(){ // 関数の定義

}

$x = myFunction(); // 関数の呼び出し
?>

しかし、関数の本体の中で直接その関数を呼び出すとどうなるでしょう?

<?php
function myFunction(){
  $x = myFunction()
  ...
  return $x;
}

$y = myFunction();

関数の本体の中でその関数自身を呼び出すことを再帰と呼びます。理論上はかなり難しく思えますが、実際にはもっとずっと簡単です。

数を累乗する計算の関数を作りましょう。代数の授業で覚えているかもしれませんが、数の n 乗は、その数を n 回自身に掛け合わせたものを意味します。php では次のようになります:

<?php
function myDegree($x, $n){
  if($n == 0){
	return 1;
  }
  if($n < 0){
    return myDegree( 1/$x, -$n); // -$n は符号を負から正に変えることを意味する
  }
  return $x * myDegree($x, $n-1); // 関数の中での関数の呼び出し
}

$y = myDegree(2, -4); // 一番最初の関数の呼び出し
print $y;
?>

では、この関数を詳しく見ていきましょう。まず、return の行の後、関数はもう実行されず、return で指定された値を返します。

最初の構文 if($n == 0) — 累乗が 0 なら、1 が返されます。ここはすべて明快です。数の 0 乗は 1 になります。次に、if($n < 0) — 負の累乗を指定した場合、累乗を正にしますが、その際、累乗される数を逆数(分数)にひっくり返します。これも累乗の定義によってできることで、それを利用しました。

そして最後は、累乗が 0 でも負でもない場合に働きます。その場合、累乗を 1 ずつ減らすたびに関数を呼び出し、その都度、私たちの数を $x で掛けます。

私たちの関数の各イテレーション(繰り返し)を見てみましょう:

1. 累乗 -4、数 2。

ここでは 2 番目の if が実行され、数は分数になり、累乗は正になります。

2. 累乗 4、数 0.5。

累乗は正で 0 でないので、if を通り、次が実行されます

return $x * myDegree($x, $n-1)

3. 累乗 3、数 0.25。

4. 累乗 2、数 0.125。

5. 累乗 1、数 0.0625。

ここでは最初の if が働きます。つまり 1 が返され、この 1 が前の関数の結果に掛けられ、これ以上の再帰はありません。

もう 1 つの似た例、数の階乗です。数 n の階乗は、1 から n までのすべての数を掛け合わせたものです。つまり数 6 の階乗は 6*5*4*3*2*1 = 720 になります。そしてお察しのとおり、再帰を使います。

<?php
function myRecursion($x){
  if($x == 1){
    return $x;
  }
  return $x*myRecursion($x-1);
}

$y = myRecursion(8);
print $y;
?>

この例は最初のものよりさらに簡単なので、myRecursion 関数のパラメーターの変化を読み解くのはあなたに任せます。