当前位置: 首页 > news >正文

递归(实践版)

这篇博客我不会写太多细节,我只做一件事,那就是教你如何写好一个递归.

二叉树的后序遍历

public void dfs(TreeNode root){
   if(root==null)return;
   dfs(root.left);
   dfs(root.right);
   System.out.println(root.val);
}

归并排序

    public void merge(int[] nums,int left,int right){
        if(left>=right)return;
        int mid=left+(right-left)/2;

        merge(nums,left,mid);
        merge(nums,mid+1,right);
        合并两个有序数组......
    }

一,函数头的设计

找到相同的子问题,比如在二叉树的后序遍历,需要依次遍历左节点,右节点,根节点,所以打印单个节点就是相同的子问题,我们的函数参数就只需要(TreeNode root).归并排序的参数需要包含数组及区间边界(left/right),因为相同的子问题是处理数组的一个子区间

二,函数体的书写

忘掉递归展开的细节图,把递归函数抽象成一个整体,这是很重要的一点,"抽象"思想在计算机中无处不在,所以不要把精力耗费在细节的钻研上,要学会搭积木,把整个递归函数当成一个黑盒,我们输入数据,递归函数返回一个唯一的值.比如二叉树的后序遍历,我们就是要打印左节点,所以调用递归函数(这时候的递归函数就抽象成我们输入值,它会打印值)并传入左节点,然后打印右节点,调用递归函数并传入右节点,最后打印自身,也就是根节点.再比如,归并排序,先是左排序,调用递归函数(我们传入数组,它返回排序后的数组)并传入左数组,然后右排序,调用递归函数传入右数组,最后将两个排序后的数组进行合并.

三,终止条件

不能再分割的问题,就是字面意思,比如二叉树的后序遍历,节点等于空时,归并排序,数组不存在时,直接返回.

递归是自我复制的艺术。当写下dfs(root.left)时,本质是创造无数个遵循相同规则的黑箱副本。这就像分形图案:定义基础形状(终止条件)和生长规则(递归调用),复杂结构自然涌现。

http://www.dtcms.com/a/106858.html

相关文章:

  • 阿里云AI Studio 2.0:拖拽搭建企业级智能客服系统
  • 信息学奥赛一本通 1611:仓库建设 | 洛谷 P2120 [ZJOI2007] 仓库建设
  • Cribl 创建路线Route
  • dubbo RPC协议
  • Unity Standard Shader 解析(二)之ForwardAdd(标准版)
  • <贪心算法>
  • 第四章、Isaacsim在GUI中构建机器人(3):添加摄像头和传感器
  • Java语言如何用AI实现文件报告的自动质检?
  • Vue3编译器深度解析:从模板编译到极致性能优化
  • 【NLP 面经 5】
  • 通过ansible+docker-compose快速安装一主两从redis+三sentinel
  • 获取最新浏览器驱动,并自动安装适配浏览器
  • 使用 Amazon Lightsail 启动并配置 WordPress 实例教程
  • LRU缓存是什么
  • DataFrame基础(不包含列删除及行相关操作)
  • error LNK2019: 无法解析的外部符号 __imp__XXXX,该符号在函数xxxxx中被引用
  • 45、Vue 中的动态组件
  • 深入理解多线程编程:从基础概念到实战应用
  • 【C++】类和对象(二)
  • 第三章 知识图谱赋能 RAG:构建结构化知识引擎
  • CoT-VLA:视觉-语言-动作模型的视觉思维链推理
  • 软件工程面试题(二十三)
  • Web服务器主动推送技术(SSE)
  • MongoDB 复制集实战
  • 笔记:docker安装(ubuntu 20.04)
  • C# 中充血模型和‌贫血模型
  • 从查重报告入手的精准论文降重秘籍
  • 基于 Spring Cloud 与 Spring Boot 的工程项目管理系统源码:重塑工程管理新范式​
  • 文件实时备份软件PanguFlow
  • zabbix监控网站(nginx、redis、mysql)