PHP はまだ比較的一般的に使用されているため、PHP の再帰アルゴリズムを研究し、ここで皆さんに共有したいと思います。 PHP は、ネストされた略語名で、英語の Hypertext Preprocessing Language (PHP: Hypertext Preprocessor) の略称です。 PHP は、サーバー側で実行され、HTML ドキュメントに埋め込まれるスクリプト言語であり、現在多くの Web サイト プログラマーによって広く使用されています。 PHP の独自の構文は、C、Java、Perl、および PHP 独自の革新的な構文を組み合わせたものです。
PHP には非常に強力な機能があり、すべての CGI または JavaScript 関数を PHP で実装でき、ほとんどすべての一般的なデータベースとオペレーティング システムをサポートしています。ここでは、PHP の再帰アルゴリズムを詳しく紹介します。
PHP 再帰アルゴリズム コード:
<ol class="dp-xml"> <li class="alt"><span><span class="tag"><?</SPAN><SPAN class=tag-name>php</SPAN><SPAN> </SPAN></SPAN><LI class=""><SPAN>//定义PI一分的角度的值 </SPAN><LI class=alt><SPAN>define("PII",M_PI/180); </SPAN><LI class=""><SPAN> </SPAN><LI class=alt><SPAN>//新建图像资源,并定义其背景为白色,前景色为黑色 </SPAN><LI class=""><SPAN>$</SPAN><SPAN class=attribute>im</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>imagecreate</SPAN><SPAN>(670,500); </SPAN></SPAN><LI class=alt><SPAN>$</SPAN><SPAN class=attribute>white</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>imagecolorallocate</SPAN><SPAN>($im,0xFF,0xFF,0xFF); </SPAN></SPAN><LI class=""><SPAN>$</SPAN><SPAN class=attribute>g</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>imagecolorallocate</SPAN><SPAN>($im,0x00,0x00,0x00); </SPAN></SPAN><LI class=alt><SPAN> </SPAN><LI class=""><SPAN>//从下面实例化的代码可以得知,初始值$x,$y,$L,$a别分为300,500,100,270 </SPAN><LI class=alt><SPAN>functiondrawLeaf($g,$x,$y,$L,$a){ </SPAN><LI class=""><SPAN>global$im; </SPAN><LI class=alt><SPAN>$</SPAN><SPAN class=attribute>B</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>50</SPAN><SPAN>; </SPAN></SPAN><LI class=""><SPAN>$</SPAN><SPAN class=attribute>C</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>9</SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN>$</SPAN><SPAN class=attribute>s1</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>2</SPAN><SPAN>; </SPAN></SPAN><LI class=""><SPAN>$</SPAN><SPAN class=attribute>s2</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>3</SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN>$</SPAN><SPAN class=attribute>s3</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>1</SPAN><SPAN>.2; </SPAN></SPAN><LI class=""><SPAN>if($L</SPAN><SPAN class=tag>></span><span>$s1){ </span></span></li> <li class="alt"><span>//计算叶子的定位上面 </span></li> <li class=""> <span>$</span><span class="attribute">x2</span><span>=$x+$L*cos($a*PII); </span> </li> <li class="alt"> <span>$</span><span class="attribute">y2</span><span>=$y+$L*sin($a*PII); </span> </li> <li class=""> <span>$</span><span class="attribute">x2R</span><span>=$x2+$L/$s2*cos(($a+$B)*PII); </span> </li> <li class="alt"> <span>$</span><span class="attribute">y2R</span><span>=$y2+$L/$s2*sin(($a+$B)*PII); </span> </li> <li class=""> <span>$</span><span class="attribute">x2L</span><span>=$x2+$L/$s2*cos(($a-$B)*PII); </span> </li> <li class="alt"> <span>$</span><span class="attribute">y2L</span><span>=$y2+$L/$s2*sin(($a-$B)*PII); </span> </li> <li class=""><span> </span></li> <li class="alt"><span>//计算叶子的定位下面 </span></li> <li class=""> <span>$</span><span class="attribute">x1</span><span>=$x+$L/$s2*cos($a*PII); </span> </li> <li class="alt"> <span>$</span><span class="attribute">y1</span><span>=$y+$L/$s2*sin($a*PII); </span> </li> <li class=""> <span>$</span><span class="attribute">x1L</span><span>=$x1+$L/$s2*cos(($a-$B)*PII); </span> </li> <li class="alt"> <span>$</span><span class="attribute">y1L</span><span>=$y1+$L/$s2*sin(($a-$B)*PII); </span> </li> <li class=""> <span>$</span><span class="attribute">x1R</span><span>=$x1+$L/$s2*cos(($a+$B)*PII); </span> </li> <li class="alt"> <span>$</span><span class="attribute">y1R</span><span>=$y1+$L/$s2*sin(($a+$B)*PII); </span> </li> <li class=""><span> </span></li> <li class="alt"><span>//别分画叶子的主干以及叶面 </span></li> <li class=""><span>ImageLine($im,(int)$x,(int)$y,(int)$x2,(int)$y2,$g); </span></li> <li class="alt"><span>ImageLine($im,(int)$x2,(int)$y2,(int)$x2R,(int)$y2R,$g); </span></li> <li class=""><span>ImageLine($im,(int)$x2,(int)$y2,(int)$x2L,(int)$y2L,$g); </span></li> <li class="alt"><span>ImageLine($im,(int)$x1,(int)$y1,(int)$x1L,(int)$y1L,$g); </span></li> <li class=""><span>ImageLine($im,(int)$x1,(int)$y1,(int)$x1R,(int)$y1R,$g); </span></li> <li class="alt"><span> </span></li> <li class=""><span>//再次递归调用本身 </span></li> <li class="alt"><span>drawLeaf($g,$x2,$y2,$L/$s3,$a+$C); </span></li> <li class=""><span>drawLeaf($g,$x2R,$y2R,$L/$s2,$a+$B); </span></li> <li class="alt"><span>drawLeaf($g,$x2L,$y2L,$L/$s2,$a-$B); </span></li> <li class=""><span>drawLeaf($g,$x1L,$y1L,$L/$s2,$a-$B); </span></li> <li class="alt"><span>drawLeaf($g,$x1R,$y1R,$L/$s2,$a+$B); </span></li> <li class=""><span>} </span></li> <li class="alt"><span>} </span></li> <li class=""><span> </span></li> <li class="alt"><span>//实例化 </span></li> <li class=""><span>drawLeaf($g,300,500,100,270); </span></li> <li class="alt"><span>header("Content-type:image/png"); </span></li> <li class=""><span>imagepng($im); </span></li> <li class="alt"> <span></span><span class="tag">?></span><span>在我个人的PHP编程经验中,递归调用常常与静态变量使用。静态变量的含义可以参考PHP手册。希望下面的代码,会更有利于对递归以及静态变量的理解 </span> </li> <li class=""><span> </span></li> <li class="alt"><span>header("Content-type:text/plain"); </span></li> <li class=""><span>functionstatic_function(){ </span></li> <li class="alt"> <span>static$</span><span class="attribute">i</span><span>=</span><span class="attribute-value">0</span><span>; </span> </li> <li class=""> <span>if($i++</span><span class="tag"><</span><span class="tag-name">10</span><span>){ </span> </li> <li class="alt"><span>echo$i."n"; </span></li> <li class=""><span>static_function(); </span></li> <li class="alt"><span>} </span></li> <li class=""><span>} </span></li> <li class="alt"><span>static_function(); </span></li> </ol>
このコードは 1 から 10 までの数値を出力します。 static_function 関数を 2 回目に実行すると、変数 i は静的変数であるため解放されずに保持され、自動インクリメントされた値が取得されます。