如何从二进制结构中递归提取

时间:2014-07-03 03:16:06

标签: python search recursion data-structures graph

我在Python中有这个类:

class PointInfo(object):

    def __init__(self, pnt, vect, src1, src2, fun):

        self.point = pnt
        self.vector = vect
        self.src1 = src1
        self.src2 = src2
        self.func = fun

我创建了一个列表(imp_list),该列表的每个元素都是PointInfo类型的对象,source1或source2可以引用某个基点(以“Original”开头)或者它们包含前一个元素的索引这个列表通过该元素的帮助我们创建了这个对象。

每个对象构建如(source1 function source2)函数是一些布尔运算,现在我想追溯每个点,找出每个点的来源,直到到达基点。

例如,如果我有这样的列表: enter image description here

如果我想追溯0点来自哪里,它必须给我:(Ori1 & Ori2)

或者第1点来自它,它必须给我:(Ori3 | (Ori1 & Ori2))

或者第2点来自它,它必须给我:(Ori4 ^ (Ori1 & Ori2))

或者第3点来自它,它必须给我:(Ori5 & (Ori3 | (Ori1 & Ori2)))

依此类推,我如何通过python帮助实现这一目标?

2 个答案:

答案 0 :(得分:1)

这是实现目标的一种方式:

def trace_source(point):
    if str(point.src1).startswith("Ori") and str(point.src2).startswith("Ori"):
        return '('+point.src1+' '+str(point.func)+' '+point.src2+')'
    elif str(point.src1).startswith("Ori") and not str(point.src2).startswith("Ori"):
        return '('+point.src1+' '+str(point.func)+' '+trace_source(imp_list[point.src2])+')'
    elif not str(point.src1).startswith("Ori") and str(point.src2).startswith("Ori"):
        return '('+trace_source(imp_list[point.src1])+' '+str(point.func)+' '+point.src2+')'
    else:
        return '('+trace_source(imp_list[point.src1])+' '+str(point.func)+' '+trace_source(imp_list[point.src2])+')'

这是基本的想法。您可能需要稍微调整一下代码,具体取决于数据结构。

修改

我使用您给定的类使用以下列表测试了您的代码:

imp_list = []
imp_list.append(PointInfo(None, None, "Ori1", "Ori2", "&"))
imp_list.append(PointInfo(None, None, 0, "Ori3", "|"))
imp_list.append(PointInfo(None, None, 0, "Ori4", "^"))
imp_list.append(PointInfo(None, None, 1, "Ori5", "&"))
imp_list.append(PointInfo(None, None, 3, "Ori6", "&"))

for point in imp_list:
    print  trace_source(point)

结果是:

(Ori1 & Ori2)
((Ori1 & Ori2) | Ori3)
((Ori1 & Ori2) ^ Ori4)
(((Ori1 & Ori2) | Ori3) & Ori5)
((((Ori1 & Ori2) | Ori3) & Ori5) & Ori6)

所以,显然这会奏效。

答案 1 :(得分:0)

您只需使用递归过程执行深度优先搜索,就像@ user2963623给出的那样。递归的重要部分是:

  1. 识别基本案例

  2. 参数如何通过递归调用进行更改

  3. 当前等级结束后,我们返回上一级的结果

  4. 在您的特定情况下,给定一个点x,您可以通过以下链接继续追溯' src1src2或两者之间,直到您到达'

    <强> 1。基本情况:

    如果src1src2都以&#39; origin&#39;开头,则返回

    <强> 2。递归探索

    &#39; SRC1&#39;如果它有一个&#39;链接&#39;到其他方面

    或&#39; src2&#39;如果它有一个&#39;链接&#39;到其他方面

    或&#39; src1&#39;和&#39; src2&#39;如果两者都有一个&#39;链接&#39;到其他方面

相关问题