在python函数中编写递归函数:不赞成?

时间:2015-07-29 05:16:12

标签: python recursion closures pep8

最近,我养成了在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)

Problem source here

我这样做的原因是因为您可能不想使用辅助函数污染命名空间。另外,如果您想从包装函数访问变量,可以将辅助函数视为闭包。

但这种代码编写方式是否已被弃用?我无法在PEP 8中的任何地方找到声明不鼓励在函数内嵌入函数。

1 个答案:

答案 0 :(得分:1)

我知道对Python中的嵌套函数没有限制。我不认为用下划线引导名称是有道理的。因为它是一个嵌套的函数定义,所以它不会与该局部作用域之外的名称冲突,所以只需使用最自然流动的名称(就像你正在向某人阅读函数并解释它是如何工作的那样)。

另一方面,由于缺少尾递归消除,Python中最好避免递归。我建议阅读:http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html ...并查看是否可以将代码转换为迭代实现。