代码之家  ›  专栏  ›  技术社区  ›  hlin117 zzzz

在python中的函数中编写递归函数:已弃用?

  •  0
  • hlin117 zzzz  · 技术社区  · 9 年前

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

    我这样做的原因是因为您可能不想用助手函数污染命名空间。此外,您可以将helper函数视为闭包,以防您希望从包装器函数访问变量。

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   Jim Dennis    9 年前

    我知道Python中没有针对嵌套函数的限制。我不认为在名字前面加下划线是正确的。因为是一个嵌套函数定义,它不会与本地范围之外的名称冲突,所以只需使用最自然流动的名称(就像您正在向某人阅读函数并解释其工作原理一样)。

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