再帰的である必要はないと思います。これだけでうまくいくと思います:
bool madeReplacement;
行う:
bool madeReplacement = false
セットの各メンバーについて、X:
セットの他のメンバーごとに、Y:
Y.name のすべてのインスタンスを X.value の Y.value に置き換えます。何かを置き換えた場合は、madeReplacement = true です。
while (madeReplacement)
例:
$var1 は値 1 です
$var2 は値 $var1 です
$var3 は値 $var2 + 2 です
$var3.value には $var2 が含まれています。$var2 を $var1 に置き換えます -> $var1 + 2
$var2.value には $var1 が含まれています。$var1 を 1 に置き換えます -> 1
$var3.value には $var1 が含まれます。$var1 を 1 に置き換えます -> 1 + 2
値に他の名前が含まれていないため、実行が終了しました。
「順不同で評価した」にもかかわらず、最終的には正しい答えが得られました。ただし、このアルゴリズムは最悪の場合 O(n^3) になる可能性があります (長いチェーンで互いに参照する n 個の変数があり、間違った端で置換を開始したと想像してください)。これを解決する 1 つの方法は、X.value に Y.name が含まれている場合、最初に Y.value を再帰的に評価することです (残りのセットに対して同じループを実行します)。これにより、最悪の場合は O(n^2) になるため、再帰的アプローチが適切であるというあなたの疑いは正しいかもしれません;)
(変数名が必ず$で始まるかどうかわからなかったので、気にしないように書きました)