拿捏递归之法

拿捏递归之法

作者:小木蕊 2024年3月24日

递归(Recursion)是计算机科学中的一个重要概念,它指的是一个函数在其定义中直接或间接调用自身的方法。递归通常用于解决那些可以分解为更小、更简单的同类子问题的问题。递归的基本思想是将问题分解为更小的子问题,子问题再分解为更小的子问题,直到问题可以直接解决或达到某个终止条件。

思想讲起来很简单,就是自己调用自己,但是写起代码来全看感觉,能不能运行全靠运气。我想这是许多和我一样的小白的感受,那么怎么来解决这一问题呢。

其实很多东西都是有技巧,有方法的。我们只需要遵循其基本的方法论。系统的训练,小白也可以掌握递归。

递归步骤

我们将递归的思路拆分为三步

  1. 确定递归函数的返回值和参数
  2. 确定递归结束条件
  3. 思考单层递归函数逻辑

我们每次写递归函数时都刻意去这样思考

举个例子理解一下

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

img

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

img

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

带入上面的方法论来分析代码

  1. 确定递归函数的返回值和参数

    void invert(TreeNode node) {}
  2. 确定递归结束条件
    if (node.left == null && node.right == null) return;
  3. 思考单层递归函数逻辑
    TreeNode temp = node.left;
    node.left = node.right;
    node.right = temp;
    if (node.left != null)
        invert(node.left);
    if (node.right != null)
        invert(node.right);

按照这样的步骤分析代码将会变得清晰明了

完整的代码

class Solution {
    public TreeNode invertTree(TreeNode root) {
        //
        if (root == null) {
            return null;
        }
        invert(root);
        return root;
    }
​
    //1 确定返回值和参数
    void invert(TreeNode node) {
        //2确定终止条件
        //3思考单层递归逻辑
        if (node.left == null && node.right == null) return;
        TreeNode temp = node.left;
        node.left = node.right;
        node.right = temp;
        if (node.left != null)
            invert(node.left);
        if (node.right != null)
            invert(node.right);
​
    }
}

天赋决定的是一个人的上限,而下限是由努力和刻意练习决定的,这句话大家一起共勉

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值