传递列表时,epsilon闭包字典的递归停止工作

时间:2018-03-12 01:36:00

标签: python dictionary recursion

我目前正在为python中的epsilon闭包创建一个函数。我正在使用递归来运行使用epsilon的NFA中的每个可能的转换。我对该函数的输入是一个格式为:

的字典
tf2 = {('q0','a') : 'q1', ('q1','eps') : ['q2', 'q3'], ('q3','eps') : 'q0', ('q2','a') : 'q4', ('q4','eps') : 'q3'}

其中键是2元组(当前状态,输入),值是结果状态。

在这种情况下,我试图关闭的转换是'eps'是键的第二部分的转换。

我遇到的问题是每当传入包含列表的值时(比如在('q1','eps') : ['q2', 'q3']条目中),我的递归会因"unhashable type: 'list'"异常而失败。

我现在的代码如下:

tf2 = {('q0','a') : 'q1', ('q1','eps') : ['q2', 'q3'], ('q3','eps') : 'q0', ('q2','a') : 'q4', ('q4','eps') : 'q3'}

def epsilonClosure(transition, state):
    closure = []
    if (state, 'eps') not in transition:    # epsilon transition not possible
        return closure

    elif (state, 'eps') in transition:    # epsilon transition is possible
        closure.append(state)
        state = transition[(state, 'eps')]
        epsilonClosure(transition, state)

    if state not in closure:    # adds current state to list if not visited before
        closure.append(state)
    return closure

epsilonClosure(tf2, 'q1')

此代码适用于字典中的非列表值,但在命中列表时会中断。

任何帮助将不胜感激,谢谢!

-edit 固定代码,因此在隔离时可执行。遗憾!

1 个答案:

答案 0 :(得分:0)

让我们暂时忽略错误,并根据问题进行思考。您的函数需要状态名称作为变量state的值。但是,列表['q2', 'q3']不是有效状态。而是每个字符串'q2''q3'都是。您需要修改算法以将此考虑在内。我可以想到两个选择:

  1. 更改参数列表以接受状态的列表。然后迭代这个列表。

  2. 更改递归调用以调用列表中每个状态的函数。

  3. 如果您可以控制字典输入,我建议您使用列表作为所有值。您可以在需要时轻松制作包含一个州的列表。这将允许您编写算法以始终处理状态名称列表。

    如果您无法执行此操作,则首先必须检查字典中的值是否为列表,并将其处理为与字符串不同。