拿捏递归之法
作者:小木蕊 2024年3月24日
递归(Recursion)是计算机科学中的一个重要概念,它指的是一个函数在其定义中直接或间接调用自身的方法。递归通常用于解决那些可以分解为更小、更简单的同类子问题的问题。递归的基本思想是将问题分解为更小的子问题,子问题再分解为更小的子问题,直到问题可以直接解决或达到某个终止条件。
思想讲起来很简单,就是自己调用自己,但是写起代码来全看感觉,能不能运行全靠运气。我想这是许多和我一样的小白的感受,那么怎么来解决这一问题呢。
其实很多东西都是有技巧,有方法的。我们只需要遵循其基本的方法论。系统的训练,小白也可以掌握递归。
递归步骤
我们将递归的思路拆分为三步
-
确定递归函数的返回值和参数
-
确定递归结束条件
-
思考单层递归函数逻辑
我们每次写递归函数时都刻意去这样思考
举个例子理解一下
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
示例 3:
输入:root = [] 输出:[]
带入上面的方法论来分析代码
-
确定递归函数的返回值和参数
void invert(TreeNode node) {}
-
确定递归结束条件
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);
按照这样的步骤分析代码将会变得清晰明了
完整的代码
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); } }
天赋决定的是一个人的上限,而下限是由努力和刻意练习决定的,这句话大家一起共勉