mapSearch是一个接受键和地图的函数,并返回与键相关的值,如果键不存在则返回None,然后返回None。
问题:当我运行搜索功能时,无论我为密钥输入什么内容,它都会保持返回相同的值。
class EmptyMap():
__slots__ = ()
class NonEmptyMap():
__slots__ = ('left', 'key', 'value', 'right')
EMPTY_MAP = EmptyMap()
def mkEmptyMap():
return EMPTY_MAP
def mkNonEmptyMap(b1, key, value, b2):
node = NonEmptyMap()
node.left = b1;
node.key = key;
node.value = value;
node.right = b2;
return node;
def mapInsert(key, value, mp):
if isinstance(mp, EmptyMap):
return mkNonEmptyMap(mkEmptyMap(), key, value, mkEmptyMap())
else:
if key == mp.key:
mp.value = value
elif mp.key < key:
mp.left = mapInsert(key, value, mp.left)
else:
mp.right = mapInsert(key, value, mp.right)
return mp
def search(key, mp):
if isinstance(mp, EmptyMap):
return None
elif isinstance(mp, NonEmptyMap):
if key == mp.key:
return mp.value
elif mp.key < key:
mp.left = search(key, mp.left)
return mp.value
else:
mp.right = search(key, mp.right)
return mp.value
答案 0 :(得分:1)
我非常确定您遇到的问题只是因为您未获得mapInsert
所期望的返回值。当前代码始终返回插入提供值的节点,即使它是树中某处的叶节点。 (实际上,并不是我仔细观察它有一些额外的错误,你正在递归并返回。)
我认为您应该更改return
else
块mapInsert
中的mp
语句,以返回mp.left
,而不是递归调用的结果。调用的结果应分配到mp.right
或def mapInsert(key, value, mp):
if isinstance(mp, EmptyMap):
return mkNonEmptyMap(mkEmptyMap(), key, value, mkEmptyMap())
else:
if key == mp.key:
mp.value = value
elif mp.key < key:
mp.left = mapInsert(key, value, mp.left) # don't return recursive result
else:
mp.right = mapInsert(key, value, mp.right) # pass the right child here!
return mp # always return mp from this branch
,具体取决于我们递归的那一方。
{{1}}
注意更多&#34; Pythonic&#34;设计可能会使用类中的方法,而不是单独的函数来处理这种事情。这需要对空树进行稍微不同的处理。
答案 1 :(得分:0)
一个明显的问题:
if key == mp.key:
mp.value = value
elif mp.key > key:
return mapInsert(key, value, mp.left)
else:
return mapInsert(key, value, mp.left)
其中一个根本没有返回任何东西,其他两个返回相同的东西。