私はクラス内で再帰関数を使用しています。この関数は、変数$estados
の値を変更します。最初の呼び出しではすべてが正常です.2番目の呼び出しでは、関数は関数の最後の呼び出しの変数の値を変更します。PHP - 最後の呼び出しと同じ変数を使用する再帰関数
これは私のコードです。
class Trab3Code
{
public function fechoEpsilon($automato, $estado)
{
$estados = $automato->transicao($estado, '&');
$fechos = array();
if (!empty($estados)) {
foreach ($estados as $elemento) {
$fechos[] = $this->fechoEpsilon($automato, $elemento);
}
}
$estados[] = $estado;
return array_unique(array_merge($estados, $fechos));
}
}
私は$automato
変数の関数から$estado
変数の新しい値を取得します。関数の戻り値は配列です。最初の実行では、すべてが大丈夫です。 2回目の実行では、関数の戻り値は空の配列になり、それは最初の実行の以前の値よりも優先されます。
誰でも手伝ってもらえますか?
--- EDIT ---
私の関数の最初の呼び出しはfechoEpsilon($automato, 0)
です。 は$estados
の値が含まれている必要があります言われていること、少なくとも:最初のコール しかし、私は取得していた結果である
array(
0 => 1
1 => 3
)
空の配列です。それともそれは、複雑にautomatasについては、この作品を見える場合
$estados[] = $estado;
申し訳ありませんが、この行にsettedされるだけ0
値を持つ配列。 fechoEpsilon
関数は、オートマトン内の状態のEpsilon Closureを計算します。
私は値が変化していることを知っていますが、それはわかりません。変数の値を呼び出しにダンプすると、変数が変更され、最終的には最後の呼び出しの値が返されます。これは空の配列です。 静的メソッド呼び出しについて申し訳ありませんが、間違いでしたが、$this
で使用していました。私はコードを更新しました。
'$ estados'はローカル変数です。再帰呼び出しでそれを変更しても、元の呼び出しには影響しません。 – Barmar
静的メソッドではありませんが、静的に 'Trab3Code :: fechoEpsilon'を呼び出しています – Manulaiko
@Manulaikoメソッドは' $ this'を使用しないので、静的メソッドのように使うことができます。 – Barmar