Python - 我如何 return 来自递归的值
Python - how do I return value from recurrsion
我正在尝试 运行 此代码用于在二叉树中搜索元素。它运行良好,但我无法 return 该值但可以显示它。
这是我的代码:
def getNodeAddress(self, data):
print(self._getNodeAddress(data, self.root))
def _getNodeAddress(self, data, root):
if root:
if root.data == data:
print("<<<< ", root.data)
return root
self._getNodeAddress(data, root.left)
self._getNodeAddress(data, root.right)
def _getNodeAddress(self, data, root, res):
if root:
if root.data == data:
print("<<<< ", root.data)
res = root
self._getNodeAddress(data, root.left, res)
self._getNodeAddress(data, root.right, res)
print(res)
return res
所以在上面的方法中,它遍历树来寻找作为变量键的值,当它找到一个时,它打印如“print("<<<< ", root.data )”,它确实按预期显示。但是现在,当我需要 return 父方法的值“getNodeAddress”时,问题就出现了。我无法打印父方法中的值。它只是打印“None”
所以我的问题是如何 return 递归的值。
我也尝试了上面代码中方法名相同的第二种方法,但仍然是完全相同的问题
任何帮助将不胜感激
看起来只有基本情况实际上是 returning 任何东西。您还需要在 non-base 案例中添加 return 语句。例如:
def _getNodeAddress(self, data, root):
if root:
if root.data == data:
print("<<<< ", root.data)
return root
res = self._getNodeAddress(data, root.left)
if res is None:
res = self._getNodeAddress(data, root.right)
return res
二叉树
这棵特定的树性能不佳,因为它在所有分支和节点中执行线性(递归)搜索。这意味着如果您的树有 1,000,000 个节点,则可能需要 1,000,000 次递归才能找到数据。如果您实施了适当的 binary search tree,您可以保证 20 次递归或更少 .
的结果
除此之外,我们仍然可以为您的树实施 find(t, data)
,t
-
def find(t, data):
if not t:
return None
elif t.data == data:
return t
else:
return find(t.left, data) or find(t.right, data)
因为递归是一种函数式继承,所以将它与函数式风格一起使用会产生最好的结果。这意味着我们避免了突变、变量重新分配和其他副作用。
请注意,此函数并不像您的原始函数名称所暗示的那样return 路径。如果我们想获得树中匹配数据的确切路径,我们可以通过添加默认的 path
参数 -
来实现
def find(t, data, path = ()):
if not t:
return None
elif t.data == data:
return (*path, t)
else:
return find(t.left, data, (*path, t)) or find(t.right, data, (*path, t))
注意 path
如何以空元组开始,()
。每个递归步骤将当前树节点 t
追加到路径中,直到最终找到 data
时,将最终节点追加到路径中并 returned.
二叉搜索树
二叉搜索树允许您以对数时间遍历树。这意味着可以提供近乎即时的结果,而普通 (non-search) 二叉树中的相同数据可能会使您的 cpu 陷入停顿。
# bst variant
def find(t, data):
if not t:
return None
elif data < t.data:
return find(t.left, data)
elif data > t.data:
return find(t.right, data)
else:
return t
我们也可以为二叉搜索树编写 path
变体 -
# bst variant with path
def find(t, data, path = ()):
if not t:
return None
elif data < t.data:
return find(t.left, data, (*path, t))
elif data > t.data:
return find(t.right, data, (*path, t))
else:
return (*path, t)
更多 bst
如果您想阅读更多关于二叉搜索树的内容,我还有一些关于该主题的其他答案 -
我正在尝试 运行 此代码用于在二叉树中搜索元素。它运行良好,但我无法 return 该值但可以显示它。
这是我的代码:
def getNodeAddress(self, data):
print(self._getNodeAddress(data, self.root))
def _getNodeAddress(self, data, root):
if root:
if root.data == data:
print("<<<< ", root.data)
return root
self._getNodeAddress(data, root.left)
self._getNodeAddress(data, root.right)
def _getNodeAddress(self, data, root, res):
if root:
if root.data == data:
print("<<<< ", root.data)
res = root
self._getNodeAddress(data, root.left, res)
self._getNodeAddress(data, root.right, res)
print(res)
return res
所以在上面的方法中,它遍历树来寻找作为变量键的值,当它找到一个时,它打印如“print("<<<< ", root.data )”,它确实按预期显示。但是现在,当我需要 return 父方法的值“getNodeAddress”时,问题就出现了。我无法打印父方法中的值。它只是打印“None” 所以我的问题是如何 return 递归的值。
我也尝试了上面代码中方法名相同的第二种方法,但仍然是完全相同的问题 任何帮助将不胜感激
看起来只有基本情况实际上是 returning 任何东西。您还需要在 non-base 案例中添加 return 语句。例如:
def _getNodeAddress(self, data, root):
if root:
if root.data == data:
print("<<<< ", root.data)
return root
res = self._getNodeAddress(data, root.left)
if res is None:
res = self._getNodeAddress(data, root.right)
return res
二叉树
这棵特定的树性能不佳,因为它在所有分支和节点中执行线性(递归)搜索。这意味着如果您的树有 1,000,000 个节点,则可能需要 1,000,000 次递归才能找到数据。如果您实施了适当的 binary search tree,您可以保证 20 次递归或更少 .
的结果除此之外,我们仍然可以为您的树实施 find(t, data)
,t
-
def find(t, data):
if not t:
return None
elif t.data == data:
return t
else:
return find(t.left, data) or find(t.right, data)
因为递归是一种函数式继承,所以将它与函数式风格一起使用会产生最好的结果。这意味着我们避免了突变、变量重新分配和其他副作用。
请注意,此函数并不像您的原始函数名称所暗示的那样return 路径。如果我们想获得树中匹配数据的确切路径,我们可以通过添加默认的 path
参数 -
def find(t, data, path = ()):
if not t:
return None
elif t.data == data:
return (*path, t)
else:
return find(t.left, data, (*path, t)) or find(t.right, data, (*path, t))
注意 path
如何以空元组开始,()
。每个递归步骤将当前树节点 t
追加到路径中,直到最终找到 data
时,将最终节点追加到路径中并 returned.
二叉搜索树
二叉搜索树允许您以对数时间遍历树。这意味着可以提供近乎即时的结果,而普通 (non-search) 二叉树中的相同数据可能会使您的 cpu 陷入停顿。
# bst variant
def find(t, data):
if not t:
return None
elif data < t.data:
return find(t.left, data)
elif data > t.data:
return find(t.right, data)
else:
return t
我们也可以为二叉搜索树编写 path
变体 -
# bst variant with path
def find(t, data, path = ()):
if not t:
return None
elif data < t.data:
return find(t.left, data, (*path, t))
elif data > t.data:
return find(t.right, data, (*path, t))
else:
return (*path, t)
更多 bst
如果您想阅读更多关于二叉搜索树的内容,我还有一些关于该主题的其他答案 -