2

再帰関数を実行しようとしていますが、正しく動作しません。コードにエラーは見られませんが、これは PHP では不可能なのでしょうか?

<?php

$herpNum = 0;

function herp() {
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }
}

herp();

?>

これを実行すると、結果は 1 の長いリストになります。

4

4 に答える 4

4

$herpNum は関数と同じスコープにないため、関数内に新しい $herpNum を作成しています。デフォルトは 0 で、それに 1 を追加しています。

引数として渡すか、グローバル変数として持つことができます。

$herpNum = 0;

function herp($herpNum) {
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp($herpNum);
    }
}

herp($herpNum);

また

$herpNum = 0;

function herp() {
    global $herpNum;

    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }
}

herp();
于 2012-12-18T00:22:41.630 に答える
3

$herpnumこれは、パラメーターを関数に渡していないためです。

<?php

$herpNum = 0;

function herp($herpNum) {
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp($herpNum);
    }
}

herp($herpNum);

?>

それはうまくいくはずです

于 2012-12-18T00:24:13.940 に答える
2

問題は、呼び出されるたび$herpNumにスコープ内のローカル変数として再定義されることです。これにより、「最大関数ネスト レベル '100' に達しました ...」エラーがスローされるまで、再帰ループが発生します。(php の ini 値 'display_errors' を 'On' に設定すると、エラーが表示されます)herp()herp()

上記のコードを次のように変更します。

$herpNum = 0;

function herp() {
    global $herpNum;
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }   
}

herp();

$herpNumによってのみ使用される場合はherp()、 内で静的変数として宣言する方がよい場合があることに注意してくださいherp()

function herp() {
    static $herpNum = 0;
    // ...

static キーワードは、関数が最初に呼び出されたときに一度だけ変数を初期化する必要があることを PHP インタープリターに伝えます。これはあなたの設計ニーズに完全に適合するはずです;)

于 2012-12-18T00:23:49.823 に答える
0

試す :

$herpNum = 0;

function herp() {
    global $herpNum;
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }
}
herp();

ただし、これはセキュリティ上の理由からお勧めできません。

次に例を示します。

...
if( $admin == true ) {
  echo 'yeah! You are the admin!';
}
...

グローバルとして宣言されていて、適切に検証されていない場合$adminは、入力するだけhttp://mysite.com/?admin=trueでテストに合格できます。

ちなみに...再帰の場合、「環境」(1つ以上の引数)をパラメーターとして注入することをお勧めします。

herp($herpNum=0); // if nothing is given, $herpNum is set to 0
于 2012-12-18T00:25:27.837 に答える