12

たとえば、再帰関数内に静的変数があり、再帰の呼び出しごとにその変数を静的にしたいのですが、再帰が終了したら、その変数をリセットして、次回再帰関数を使用して、ゼロから開始します。

たとえば、次の関数があります。

<?php
function someFunction() {
    static $variable = null;
    do stuff; change value of $variable; do stuff;
    someFunction(); # The value of $variable persists through the recursion.
    return ($variable);
}
?>

次のように関数を初めて呼び出すことができますsomeFunction();。それからもう一度呼び出します:someFunction();しかし、今回は の前の値から始まります$variable。最初に関数を呼び出したときの再帰の後で、関数を 2 回目に呼び出したときに最初からやり直すようにリセットするにはどうすればよいでしょうか。

4

5 に答える 5

9

最も簡単な方法は、変数を引数として渡すことです。ここで静的を台無しにするつもりはありません。

function someFunction($value = null) {
    do stuff; change value of $value; do stuff;
    someFunction($value); # The value of $variable persists through the recursion.
    return $value;
}

原則として、引数を関数に渡す必要があります (同じクラス内のクラス プロパティを操作しない限り)...それらはグローバルであってはならず、再帰の場合、それらを静的にすることはおそらく良い考えではありません。 .. 関数をブラック ボックスのように扱います... 値が入ります... それらを使って処理を行い、結果が出力されます。彼らは、他の場所で起こっていることを認識すべきではありません。いくつかの例外がありますが、IMO ではごくわずかです。

于 2011-04-28T02:45:58.897 に答える
3

わかりました、まあ、prodigitalson が答えを私に質問したのがわかります。ここにデモがあります:

http://codepad.org/4R0bZf1B

<?php
function someFunction($varset = NULL) {
    static $variable = NULL;
    if ($varset !== NULL) $variable = $varset;
    $variable++;
    echo $variable;
    if ($variable < 5) someFunction();
    return $variable;
}

someFunction(4);
echo "\n";
someFunction(2);
echo "\n";
someFunction(3);

?>

出力:

5
345
45
于 2011-04-28T02:49:07.480 に答える
0

$depthカウンターを使用できます:

function someFunction() {
    static $variable = null, $depth= 0;
    $depth++;

    do stuff; change value of $variable; do stuff;
    someFunction(); # The value of $variable persists through the recursion.

    $depth--;
    $temp = $variable;
    if($depth== 0){
        $variable = null;
    }
    return ($temp);
}
于 2016-09-10T10:16:28.047 に答える
-1

私は解決策を見つけました:

<?php
function someFunction($clear_static = false) {
    static $variable = null;
    if ($clear_static) {
        $variable = null;
    }
    do stuff; change value of $variable; do stuff;
    someFunction(); # The value of $variable persists through the recursion.
    return ($variable);
}

someFunction(); # first manual call.
someFunction(); # second manual call, $variable has value from previous use.
someFunction(true); # third manual call, value of $variable starts like new.
?>
于 2011-04-28T02:53:04.583 に答える