递归的实现 特性 思维要点

144 阅读1分钟

递归

  • 通过循环 调用自己

递归代码模板

def recursion(level, param1, param2, ...): 
    # 递归终止条件
    if level > MAX_LEVEL: 
	   process_result 
	   return 
       
    # 当前层的处理逻辑
    process(level, data...) 
    
    # 继续下探 到下一层 
    self.recursion(level + 1, p1, ...) 
    
    # 清理当前层
    

递归示例

22. 括号生成 题目练习

思路

  • 通过递归解决
    • 递归终止条件(左括号 和 右括号 都是n的时候)
    • 当前层的处理逻辑
      • 递归出所有的括号组合方式
      • 左括号 < n ;递归左括号
      • 右括号 < 左括号; 递归右括号
    • 下探到下一层
    • 当前层清理操作(可选 根据实际情况)
    def generate(self, left, right, n, res):
        """

        :param left:
        :param right:
        :param n:  配额总数
        :param res:
        :return:
        """
        # 终止条件 左括号n 右括号n
        if left == right == n:
            # print(res)
            self.res_lst.append(res)
            return res

        # 处理逻辑
        if left < n:
            # 下探下一层
            self.generate(left+1, right, n, res + "(")

        # 右括号必须在左括号后面  左括号的个数 > 当前右括号的个数
        # left 上限最多到n
        if left > right:
            # 下探下一层
            self.generate(left, right+1, n, res + ")")

        # 清理操作

    def generateParenthesis(self, n):
        """

        :param n:
        :return:
        """
        self.res_lst = list()
        self.generate(left=0, right=0, n=n, res="")
        return self.res_lst

98. 验证二叉搜索树

class Solution(object):
    """
    二叉搜索树具有如下特征
        节点的左子树只包含小于当前节点的数。
        节点的右子树只包含大于当前节点的数。
        所有左子树和右子树自身必须也是二叉搜索树

    思路:
        -  1.递归
        -  2.中序遍历BST 判断元素是否递增
    """

    def isValidBST1(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """

        def helper(node, lower=float('-inf'), upper=float('inf')):
            """
            判断是否是BST
            :param node: 
            :param lower: 
            :param upper: 
            :return: 
            """
            # 终止条件
            if not node:
                return True

            # 当前层判断逻辑
            val = node.val
            #  必须满足  下界限 < 当前值 < 上界限
            if val <= lower or val >= upper:    
                return False

            # 下探到下一层
            # 判断右子树是否BST
            if not helper(node.right, val, upper):
                return False
            
            # 下探到下一层
            # 判断右子树是否BST
            if not helper(node.left, lower, val):
                return False

            # 清理条件 无
            return True

        return helper(root)

递归使用的经验总结:

  • 抵制人肉搜索
  • 找最近重复性的子问题
  • 数学归纳法思维