最近,我养成了在python中的包装函数中编写递归函数的习惯。例如,我从包装器调用递归函数的习惯如下:
def sortedArrayToBST(nums):
return _toBST(nums)
def _toBST(nums):
if len(nums) == 0: return None
mid = len(nums) / 2
root = TreeNode(nums[mid])
root.left = _toBST(nums[:mid])
root.right = _toBST(nums[mid+1:])
return root
另一方面,我的新习惯是在包装器中嵌入这个递归函数:
def sortedArrayToBST(self, nums):
def toBST(nums_):
if len(nums_) == 0: return None
mid = len(nums_) / 2
root = TreeNode(nums_[mid])
root.left = toBST(nums_[:mid])
root.right = toBST(nums_[mid+1:])
return root
return toBST(nums)
我这样做的原因是因为您可能不想使用辅助函数污染命名空间。另外,如果您想从包装函数访问变量,可以将辅助函数视为闭包。
但这种代码编写方式是否已被弃用?我无法在PEP 8中的任何地方找到声明不鼓励在函数内嵌入函数。
答案 0 :(得分:1)
我知道对Python中的嵌套函数没有限制。我不认为用下划线引导名称是有道理的。因为它是一个嵌套的函数定义,所以它不会与该局部作用域之外的名称冲突,所以只需使用最自然流动的名称(就像你正在向某人阅读函数并解释它是如何工作的那样)。
另一方面,由于缺少尾递归消除,Python中最好避免递归。我建议阅读:http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html ...并查看是否可以将代码转换为迭代实现。