我正在和学生一起创建一个有限状态机的简单演示:
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”] 中的返回电流处堆栈溢出。
我能够确定问题在于两种状态的比较。事实上,我可以通过编写 s1 == s2 来生成完全相同的错误。但是 s1 == s1 (一个好的状态)工作正常。
我对正在发生的事情的最佳猜测是,它正在进行深度比较并试图遵循 s2 中的所有引用,这些引用是循环的。但为什么它是不对称的(即为什么 s1 == s1 没有同样的问题)?我该如何避免呢?