PHP で再帰関数を実装する 3 つの方法

墨辰丷
リリース: 2023-03-30 15:06:02
オリジナル
1493 人が閲覧しました

この記事では主に PHP での 3 つの再帰関数の実装方法を紹介します。興味のある方はぜひ参考にしてください。

再帰関数は、プログラミングでよく使われる関数です。その特徴は、関数自体が自分自身を呼び出すことができますが、自分自身を呼び出す前に条件付きで判断する必要があり、そうしないと無限呼び出しが発生します。この記事では、3 つの再帰関数の実装方法を示します。1 つ目はパラメーターとして参照を使用し、3 つ目は静的変数を使用します。このような問題を理解するには、グローバル変数、参照、静的変数の理解などの基本的な知識が必要です。また、自分たちの行動範囲を理解する必要もあります。ここではこれ以上ナンセンスではありません。詳細な紹介については以下を参照してください。

最初の方法: 参照をパラメータとして使用する

参照がパラメータであるかどうかに関係なく、まず参照とは何かを理解する必要があります。参照とは、単に、異なる名前を持つ 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[]; result の参照が関数に渡され、各再帰によって生成された a が結果配列 result に追加されます。したがって、この例で生成される $result 配列は Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4 ] => 5 [5] => 6 [6] => 8 [8] => 9 この例でさらに興味深いのは、echo a の値です。

12345678910

だと思っている人も多いと思いますが、実はそうではなく、1098765432です。なぜ?これは、関数が echo a を実行する前に次の関数の再帰を実行しているためです。 再帰関数の実行後、この層の echo $a, が実行され始めます。

2 番目の方法: グローバル変数を使用するグローバル変数を使用して再帰関数を完了します。 グローバル変数とは何かを理解してください。 global関数内での変数の宣言は、同じ名前の外部変数への参照に他なりません。変数のスコープはこの関数のスコープ内にあります。これらの変数の値を変更すると、当然、同じ名前の外部変数の値も変更されます。ただし、& を使用すると、同じ名前の変数は同じ名前の参照ではなくなります。グローバル変数を使用して再帰関数を実装するために、それほど深いレベルを理解する必要はありません。グローバル変数の本来の見方を維持することで、自然に再帰関数を理解できます。 コードは次のとおりです:

function test($a=0,$result=array()){
    global $result;
    $a++;
    if ($a<10) {
        $result[]=$a;
        test($a,$result);
    }
    return $result;
}
ログイン後にコピー

3 番目の方法: 静的変数を使用する

クラスで 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 を適用する効果は想像できます。 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
function summation ($count) {
   if ($count != 0) :
     return $count + summation($count-1);
   endif;
}
$sum = summation(10);
print "Summation = $sum";
?>
ログイン後にコピー

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP实现正则匹配操作的方法

实例详解php中serialize()与unserialize()函数

实例分析一个实用的php验证码类

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート