上記で php 再帰関数の使い方を紹介しました 友人は php 再帰関数の使い方をある程度理解していると思いますので、今日は php 再帰関数を実装する 3 つの方法を紹介します。
この記事では、PHP で再帰を実装するための 3 つの基本的な方法 (パラメーターとしての参照の使用、グローバル変数の使用、再帰を実装するための静的変数の使用を含む) を主に紹介し、最後に、PHP に関するデモンストレーションを示します。再帰操作のスキルについては、必要な友人が参照できます
再帰関数は、私たちがよく使用する関数の一種であり、最も基本的な特徴は、関数が自分自身を呼び出すことですが、自分自身を呼び出す前に 条件判断 が必要です。それ以外の場合は、無限に呼び出され続けます。再帰関数を実装するにはどのような方法を使用できますか?この記事では 3 つの基本的な方法を示します。これを理解するには、グローバル変数、参照、静的変数の理解、およびそれらのスコープの理解など、ある程度の基本的な知識が必要です。再帰関数は、無限レベルの分類を解決するための優れた手法でもあります。無限分類に興味がある場合は、PHP を参照して再帰関数を使用して無限分類を実現してください。複雑な真実を平易な言葉で説明することに慣れています。本当に理解できない場合は、マニュアルを参照してください。
パラメータとして参照を使用する
参照がパラメータであるかどうかに関係なく、まず参照とは何かを理解する必要があります。参照とは、単に、異なる名前を持つ 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; }
上の例は非常に単純です。条件が true の場合、result[] に a を代入し、各再帰によって生成される 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
グローバル変数を活用する
再帰関数を完成させるためにグローバル変数を活用する グローバル変数とは何かを必ず理解してください。関数内で宣言されたグローバル変数は、同じ名前の外部変数への単なる参照です。変数のスコープはこの関数のスコープ内にあります。これらの変数の値を変更すると、当然、同じ名前の外部変数の値も変更されます。ただし、& を使用すると、同じ名前の変数は同じ名前の参照ではなくなります。グローバル変数を使用して再帰関数を実装するために、それほど深いレベルを理解する必要はありません。グローバル変数の本来の見方を維持することで、自然に再帰関数を理解できます。
function test($a=0,$result=array()){ global $result; $a++; if ($a<10) { $result[]=$a; test($a,$result); } return $result; }
static変数の活用
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 test($a=0){ $a++; if ($a<10) { echo $a; test($a); } }
このような関数に直面しても、それについて心配する必要はありません。ちなみに、変数参照を深く理解していれば、この種の問題を解決するのに大いに役立ちます。
最後に、PHP で再帰と無限分類を実装する方法を共有したいと思います。具体的な実装方法は次のとおりです:
<?php echo "<pre class="brush:php;toolbar:false">"; $area = array( array('id'=>1,'area'=>'北京','pid'=>0), array('id'=>2,'area'=>'广西','pid'=>0), array('id'=>3,'area'=>'广东','pid'=>0), array('id'=>4,'area'=>'福建','pid'=>0), array('id'=>11,'area'=>'朝阳区','pid'=>1), array('id'=>12,'area'=>'海淀区','pid'=>1), array('id'=>21,'area'=>'南宁市','pid'=>2), array('id'=>45,'area'=>'福州市','pid'=>4), array('id'=>113,'area'=>'亚运村','pid'=>11), array('id'=>115,'area'=>'奥运村','pid'=>11), array('id'=>234,'area'=>'武鸣县','pid'=>21) ); function t($arr,$pid=0,$lev=0){ static $list = array(); foreach($arr as $v){ if($v['pid']==$pid){ echo str_repeat(" ",$lev).$v['area']."<br />"; //这里输出,是为了看效果 $list[] = $v; t($arr,$v['id'],$lev+1); } } return $list; } $list = t($area); echo "<hr >"; print_r($list); ?>
概要:
3 つのメソッドは、PHP の再帰関数を実装します。多くの PHP 再帰操作スキルがあなたの仕事に役立つことを願っています。
関連するおすすめ:
PHPの再帰関数でreturnを使う際の注意点、関数の効果的な使い方をご存知ですか? PHPの再帰関数の典型的な例
以上がPHP 再帰関数を実装する 3 つの方法の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。