私は学生と一緒に、有限状態マシンの簡単なデモを作成していました。
s2 = {}
s1 = {}
s1["0"] = s2
s1["1"] = s1
s2["0"] = s1
s2["1"] = s2
machine = {"start": s1, "accepting": [s1]}
def recognize(fsm, in_string):
return do_recognize(fsm, fsm["start"], in_string)
def do_recognize(fsm, current, in_string):
if len(in_string) == 0:
return current in fsm["accepting"]
return do_recognize(fsm, current[in_string[0]] ,
in_string[1:])
print (recognize(machine, "0"))
このマシンは、偶数の 0 を含む文字列を認識し、「適切な」文字列 (「1」や「010」など) で正常に動作します。しかし、上記のような「悪い」文字列では、無限ループに入り、fsm["accepting"] の戻り電流でスタック オーバーフローが発生します。
問題は 2 つの状態の比較にあると判断できました。実際、s1 == s2 と書くだけで、まったく同じバグを生成できます。しかし、s1 == s1 (良い状態) は問題なく動作します。
何が起こっているのかについての私の最善の推測は、それが深い比較を行っており、循環している s2 のすべての参照をたどろうとしているということです。しかし、なぜ非対称なのですか (つまり、s1 == s1 で同じ問題が発生しないのはなぜですか)? どうすればそれを回避できますか?