所以我在这里试图递归地比较regex和递归。用户将创建一个具有两个参数的对象,每个参数都是一个长度为1的字符串。这些字符串只能是"0"
,"1"
或"2"
。但我想以递归方式检查这些字符串是否也指向另一个字符串。像:
*
/ \
1 2
/ \
2 1
我无法弄清楚如何递归地指向一个新对象: 这就是我到目前为止所做的:
class DotNode(object):
def __init__(self, _cargo, _left=None, _right=None):
self._cargo = _cargo
self._left = _left
self._right = _right
def __eq__(self, _other):
base = ['0','1','2']
if self._left in base and self._right in base:
return self._left == _other._left and self._right == _other._right
else:
while self._left not in base or self._right not in base:
new = self._left
new2 = self._right
new3 = _other._left
new4 = _other._right
return new._left == new3._left and new2._right == new4._right
答案 0 :(得分:3)
您似乎已经知道如何执行此操作:递归。您想在此处递归调用__eq__
函数。我还建议你检查给定的货物是否是构造函数中可能的值之一 - 或者甚至更好 - 每次设置值。
class DotNode(object):
@property
def _cargo(self):
return self._vcargo
@_cargo.setter
def _cargo(self, val):
if val not in ['0', '1', '2']:
raise ValueError("{} is not a possible value for _cargo.".format(val))
self._vcargo = val
def __eq__(self, other):
return isinstance(other, DotNode) and self._cargo == other._cargo and self._left == other._left and self._right == other._right
当然,您希望将构造函数保留在此处。我刚刚写下了改变的部分。您可能已经注意到,这里甚至不需要RegExes,标准字符串比较工作正常。
_cargo
属性我在这里将_cargo
从简单属性更改为属性。那是什么意思?您可以获得Java的getter和setter,以便更好地控制可能的值。实际数据存储在_vcargo
中,当然有人可以直接写入该属性,但这绝对是愚蠢的,如果有人以某种方式使用您的代码,您肯定不负责任。如果您尝试设置与可能值不同的值,则会引发ValueError
。
__eq__
函数正如您所看到的,这个功能实际上非常简单。它所做的一切都是计算节点本身和另一个节点的货物是否相等。现在,如果两个子树也相等,则整个树都相等。如果两棵树都相等,那么在最深层次它将None
与None
进行比较,因为不再有子树。