ホームページ >バックエンド開発 >PHPの問題 >PHPで再帰を実装する方法は何ですか

PHPで再帰を実装する方法は何ですか

coldplay.xixi
coldplay.xixiオリジナル
2020-08-21 13:45:582420ブラウズ

PHP が再帰を実装する方法は次のとおりです: 1. 参照をパラメータとして使用し、コードは [$result[]=$a;test($a,$result)] です; 2. グローバル変数を使用します; 3.静的変数を使用します。コードは [static $count=0;] です。

PHPで再帰を実装する方法は何ですか

[関連する学習の推奨事項: php グラフィック チュートリアル]

php で再帰を実装する方法は次のとおりです。 :

1. 参照をパラメータとして使用する

参照がパラメータであるかどうかに関係なく、まず参照とは何かを理解する必要があります。参照とは、単に、異なる名前を持つ 2 つの変数が同じ記憶アドレスを指していることを意味します。元々、各変数には独自の格納アドレスがあり、代入と削除は独自の方法で行われました。さて、2 つの変数はストレージ アドレスを共有します。 $a=&$b; 。これが実際に意味するのは、元のストレージ アドレスに関係なく、$a は $b と同じ部屋を共有する必要があるということです。したがって、保存されているアドレス値を変更すると、両方の値に影響します。

関数は、同じ名前の関数であっても、本来は独自の処理を行います。再帰関数は、参照をパラメータとして受け取り、2 つの関数間でデータ共有を形成するためのブリッジになることを考慮します。 2 つの関数は異なるアドレスで動作しているように見えますが、実際には同じメモリ アドレスで動作します。

function test($a=0,&$result=array()){
$a++;
if ($a<10) {
 $result[]=$a;
 test($a,$result);
}
echo $a;
return $result;
 
}

上記の例は非常に単純で、判定条件としてa<10を使用し、条件が真であればresult[]にaを代入し、resultの参照を関数に渡し、aを生成します。各再帰は結果配列の結果に追加されます。したがって、この例で生成される $result 配列は Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5 ] => 6 [6] => 7 [7] => 8 [8] => 9 )。

この例でさらに興味深いのは、echo a の値です。 12345678910だと思っている人も多いと思いますが、実はそうではなく、1098765432です。なぜ?これは、関数が echoa を実行する前に次の関数の再帰を実行しているためです。実際の echo a の実行は、条件 a

例 2、

PHP のリファレンスでは、2 つの変数が同じコンテンツを指すことができます (例: $a = &$b; これは、$a と $b が同じ変数を指すことを意味します)。

次の例では、$data が参照渡しされるため、データは常に蓄積されます。

function recursion(&$data = [], $i = 0)
{
  if ($i < 10) {
    $data[] = $i;
    $i++;
    $this->recursion($data, $i);
  }
  return $data;
}
// 调用
$this->recursion();  // [0,1,2,3,4,5,6,7,8,9]

2. グローバル変数を使用する

グローバル変数を使用して再帰関数を完成させます。グローバル変数とは何かを必ず理解してください。関数内で宣言されたグローバル変数は、同じ名前の外部変数への単なる参照です。変数のスコープはこの関数のスコープ内にあります。これらの変数の値を変更すると、当然、同じ名前の外部変数の値も変更されます。ただし、& を使用すると、同じ名前の変数は同じ名前の参照ではなくなります。グローバル変数を使用して再帰関数を実装するのにそこまで深い理解は必要なく、グローバル変数の本来の見方を維持することで、自然に再帰関数を理解することができます。

function test($a=0,$result=array()){
 global $result;
 $a++;
 if ($a<10) {
  $result[]=$a;
  test($a,$result);
 }
 return $result;
}

global 関数内で変数を宣言することは、同じ名前の外部変数への参照に他なりません。変数のスコープはこの関数のスコープ内にあります。これらの変数の値を変更すると、当然、同じ名前の外部変数の値も変更されます。

function recursion($data = [], $i = 0)
{
  global $data;
  if ($i < 10) {
    $data[] = $i;
    $i++;
    $this->recursion($data, $i);
  }
  return $data;
}
  
// 调用
$this->recursion();  // [0,1,2,3,4,5,6,7,8,9]

3. 静的変数を使用する

静的変数はクラスでよく見られますが、今日では再帰関数で使用されています。 static の役割を覚えておいてください。関数が最初に呼び出されたときにのみ変数を初期化し、変数値を保持します。

例を挙げてください:

function test(){
static $count=0;
echo $count;
 
$count++;
}
test();
test();
test();
test();
test();

このコードの実行結果は何ですか? 00000ですか?絶対にありません。 01234です。まず、初めて test() を呼び出すとき、static は $count を初期化します。その後の各実行後、$count の値は保持され、初期化されなくなります。これは、文 static $count=0; を直接無視するのと同じです。

したがって、再帰関数に static を適用する効果は想像できます。再帰関数間の「ブリッジ」として使用する必要がある変数は、静的を使用して初期化され、「ブリッジ変数」の値は再帰ごとに保持されます。

function test($a=0){
 static $result=array();
 $a++;
 if ($a<10) {
  $result[]=$a;
  test($a);
 }
 return $result;
}

静的変数は最初の呼び出し時にのみ初期化されます。ローカル関数スコープ内にのみ存在しますが、プログラムの実行がこのスコープを離れても、その値は失われません。

function recursion($i = 0)
{
  static $data = [];
  if ($i < 10) {
    $data[] = $i;
    $i++;
    $this->recursion($i);
  }
  return $data;
}
  
// 调用
$this->recursion();  // [0,1,2,3,4,5,6,7,8,9]

関連する学習の推奨事項: php プログラミング (ビデオ)

以上がPHPで再帰を実装する方法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。