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

数据结构和算法之【递归】

目录认识递归递归的定义利用递归实现几个小案例链表的遍历反转字符串求N的阶乘思路总结多路递归single recursion和multi recursion斐波那契数列递推公式编码实现代码优化LeetCode-70题题解测试认识递归递归的定义计算机科学中递归是一种解决计算问题的方法其中解决方案取决于同一类问题的更小子集三个重点如下自己调用自己如果每个函数对应着一种解决方案那么自己调用自己代表着解决方案一样每次调用函数处理的数据量和上次比较会缩减且最后会缩减至无需继续递归(即要有结束条件)子集(内层函数)处理完成外层函数才能算是调用完成利用递归实现几个小案例链表的遍历package algorithm.list; import java.util.function.Consumer; /** * 这里主要介绍两种遍历方法 * 1、方式一通过Consumer函数式接口 * 2、方式二递归 */ public class ListForEach { public static void main(String[] args) { // 获取到链表的头节点然后进行遍历 Node head getHead(); // 遍历方式一 foreachOneWay(head, System.out::println); System.out.println(-------------); // 遍历方式二 foreachTwoWay(head); } /** * 遍历方式一通过调用方控制传入一个函数式接口 */ public static void foreachOneWay(Node head, ConsumerInteger consumer) { if (head null) return; for (Node p head; p ! null; ) { consumer.accept(p.val); p p.next; } } /** * 遍历方式二递归 */ public static void foreachTwoWay(Node head) { if (head null) return; recursion(head); } /** * 递归函数 */ private static void recursion(Node curr) { if (curr null) return; System.out.println(curr.val); recursion(curr.next); // 如果在这里打印就是倒序遍历的结果 // System.out.println(curr.val); } /** * 返回链表的头节点 */ public static Node getHead() { Node head new Node(5); Node node1 new Node(2); head.next node1; Node node2 new Node(1); node1.next node2; Node node3 new Node(3); node2.next node3; Node node4 new Node(4); node3.next node4; return head; } private static class Node { int val; Node next; public Node() { } public Node(int val) { this.val val; } public Node(int val, Node next) { this.val val; this.next next; } } }反转字符串package algorithm.recursion; /** * 通过递归的方式反转字符串 */ public class ReserveString { public static void main(String[] args) { String oldData zxvcd463c3iou; String newData reserveString(oldData); System.out.println(newData); } /** * 实现字符串的反转 * 返回值是一个新的字符串是参数反转后的结果 */ public static String reserveString(String data) { if (data null || data.length() 0) return data; StringBuilder result recursion(new StringBuilder(), data, 0); return result.toString(); } /** * 递归函数 */ private static StringBuilder recursion(StringBuilder builder, String data, int index) { if (index data.length()) { return builder; } recursion(builder, data, index 1); builder.append(data.charAt(index)); return builder; } }求N的阶乘package algorithm.recursion; public class Factorial { public static void main(String[] args) { for (int i 0; i 10; i) { System.out.println(factorial(i)); } } /** * 求非负整数的阶乘 */ public static int factorial(int n) { if (n 0) { throw new IllegalArgumentException(非法参数); } if (n 0 || n 1) { return 1; } return n * factorial(n - 1); } }思路总结确定能否使用递归进行求解推导出递推关系即父问题和子问题的关系以及递归的结束条件多路递归single recursion和multi recursion上述使用递归实现的几个小案例中都是每个递归函数只包含一个自身的调用称之为单路递归(single recursion)如果每个递归函数包含多个自身调用称为多路递归(multi recursion)斐波那契数列递推公式编码实现package algorithm.recursion; /** * 斐波那契数列每一个数字等于前两项数字之和 */ public class FibonacciSequence { public static void main(String[] args) { // 展示前12项数字 for (int i 0; i 13; i) { System.out.print(fibonacciSequence(i) \t); } } /** * 获取第n项数字 */ public static int fibonacciSequence(int n) { if (n 0) { throw new IllegalArgumentException(参数异常); } return recursion(n); } /** * 递归函数 */ private static int recursion(int n) { if (n 0 || n 1) { return n; } // 这里就是多路递归(multi recursion) return recursion(n - 1) recursion(n - 2); } }代码优化优化思路使用缓存进行优化记忆法空间换时间package algorithm.recursion; import java.util.HashMap; import java.util.Map; /** * 斐波那契数列每一个数字等于前两项数字之和 */ public class FibonacciSequence { // 缓存key为第n项value为第n项的值 private static final MapInteger, Integer cache new HashMap(); public static void main(String[] args) { // 展示前12项数字 for (int i 0; i 13; i) { System.out.print(fibonacciSequence(i) \t); } } /** * 获取第n项数字 */ public static int fibonacciSequence(int n) { if (n 0) { throw new IllegalArgumentException(参数异常); } return recursion(n); } /** * 递归函数 */ private static int recursion(int n) { if (n 0 || n 1) { return n; } // 查缓存如果缓存中有第n项的数字直接返回 Integer numOfN cache.get(n); if (numOfN ! null) { return numOfN; } // 缓存中没有就计算第n项的数字 numOfN recursion(n - 1) recursion(n - 2); // 将第n项的数字放入缓存中 cache.put(n, numOfN); // 这里就是多路递归(multi recursion) return numOfN; } }LeetCode-70题题解class Solution { // 缓存 private MapInteger, Integer climbStairsCache new HashMap(); public int climbStairs(int n) { // 递归结束条件 if (n 2) return n; //查缓存 Integer nr climbStairsCache.get(n); if (nr ! null) return nr; // 多路递归 nr climbStairs(n - 1) climbStairs(n - 2); // 放入缓存 climbStairsCache.put(n, nr); return nr; } }测试结果

相关文章:

数据结构和算法之【递归】

目录 认识递归 递归的定义 利用递归实现几个小案例 链表的遍历 反转字符串 求N的阶乘 思路总结 多路递归 single recursion和multi recursion 斐波那契数列 递推公式 编码实现 代码优化 LeetCode-70题 题解 测试 认识递归 递归的定义 计算机科学中&#xff0…...

高考数学97分,我的“数学直觉“比140分更好用:指针:内存的门牌号系统

目录 一.序言 二.数学直觉 三.核心概念 1.基础核心概念 1. 1.指针的本质 1.2. 指针的两大核心操作 1.3. 指针的类型 2.进阶核心概念 2.1. 指针与数组的关系 2.2. 指针的运算 2. 3. 多级指针 3.应用核心概念 3.1. 指针作为函数参数 3.2. 动态内存分配 3.3. 函数指针 4.安…...

JAVA学习day01记录day01

为了未来能跟上AI的时代,只能老骥伏枥,重返学海。 那就从java基础班开始吧。今天学习涵了Java开发的基础搭建与入门实践。 很荣幸能成为黑马程序员的广州何波校长的学生,也很幸运能在他亲自上课的班级学习,何校长幽默,…...

全屋智能不被 “网” 住[特殊字符] Home Assistant+cpolar 解锁远程控家新体验

Home Assistant 是一款专注本地控制的智能家居管理平台,能整合米家、vivo、飞利浦等多品牌设备,通过可视化界面设置 “开门开灯”“离家关插座” 等自动化场景,无需编写代码,就能让不同品牌的智能设备实现联动,摆脱多个…...

修仙游戏:C++实现修真世界

以下是一个整合了修仙元素的C小游戏框架&#xff0c;包含功法系统、丹药炼制、境界突破和地图系统。代码超过300行&#xff0c;可直接编译运行&#xff1a;#include <iostream> #include <vector> #include <map> #include <string> #include <cstd…...

大数据实时计算:Flink+AI 融合实战

一、为什么需要 FlinkAI 融合&#xff1f; 在大数据实时计算场景中&#xff0c;传统的Flink作业往往只负责数据清洗、聚合、流转等标准化处理&#xff0c;但业务需求早已不满足于"计算出结果"&#xff0c;而是需要"从结果中产生智能决策"&#xff1a; 电…...

GeoDa 空间回归分析

GeoDa 空间回归分析 前置知识&#xff1a;[[GeoDa空间自相关分析]] 难度等级&#xff1a;⭐⭐⭐⭐⭐ 更新日期&#xff1a;2026-03-16 &#x1f4cb; 目录 1. 空间回归基础2. 空间滞后模型&#xff08;SLM&#xff09;3. 空间误差模型&#xff08;SEM&#xff09;4. 空间杜宾模…...

初探 MindSpore(一):PyTorch 用户先从哪里开始

初探 MindSpore&#xff08;一&#xff09;&#xff1a;先建立最基本的框架认识 对 PyTorch 用户来说&#xff0c;MindSpore 不是一套需要从头理解的框架&#xff0c;但也绝不是“把 API 名字改掉就能迁过去”的另一层皮。MindSpore 官方文档本身就是按这个思路组织的&#xff…...

OpenClaw 安全公告激增暴露 GitHub 与 CVE 漏洞跟踪体系间的鸿沟

自托管AI Agent项目OpenClaw在发布数周后便成为GitHub星标最多的代码库,吸引了大量开发者社区和研究人员关注。但没人预料到,其快速增长很快成为全球漏洞跟踪体系的意外压力测试。 安全公告爆发式增长 2月下旬,该项目开始以开源项目罕见的速度发布安全公告,迅速暴露出两大…...

申论素材资源合集

26行政执法专项资料 文件大小: 31.8GB内容特色: 31.8GB行政执法专项资料&#xff0c;覆盖法规、案例与高频考点适用人群: 备考公务员行政执法岗、法检书记员、执法勤务辅警核心价值: 一站式掌握执法依据、程序与高频考题&#xff0c;快速提升应试能力下载链接: https://pan.qu…...

openclaw运维

这里写目录标题常用命令配置管理更新管理斜杠命令常用命令 #### Gateway 管理 # 启动 Gateway openclaw gateway# 启动并显示详细日志 openclaw gateway --verbose# 指定端口启动 openclaw gateway --port 18789配置管理 # 运行配置向导 openclaw onboard# 系统健康检查 open…...

[连载] C++ 零基础入门-5.C++ if else 条件判断(小白必看)

【C 零基础入门】第5篇&#xff1a;if else 条件判断&#xff08;小白必看&#xff09; 作者&#xff1a;咏方舟-长江支流 | 日期&#xff1a;2026-03-16 ✅ 标准C跨平台说明 本系列免费&#xff0c;敬请关注&#xff01;所有代码均采用标准C&#xff0c;不依赖任何平台…...

Gemini 3 flash架构深度拆解:从稀疏MoE到原生多模态的工程实现

Gemini 3 Pro是谷歌于2025年11月发布的旗舰级大语言模型&#xff0c;其技术内核远非“参数更大”所能概括——稀疏专家混合&#xff08;MoE&#xff09;架构、原生多模态统一语义空间、可配置思考深度与思维签名机制&#xff0c;共同构成了其性能跃迁的底层逻辑。国内技术爱好者…...

PD协议物理层深度解析:SOP在充电中的关键作用

近日&#xff0c;有大师级人物成功完成了PD快充的Only Source端软件开发&#xff0c;这一庞大工程目前展现出良好的兼容性&#xff0c;经过测试的笔记本和手机均无异常。 在技术细节上&#xff0c;他采用了ZR的SW3526 buck芯片、安森美的FUSB302物理层芯片&#xff0c;并辅以ST…...

Camera ISP 之 镜头阴影矫正(lens_shading_correction)

1、Lens Shading Lens Shading指画面四角由于入射光线不足形成暗角&#xff0c;同时由于不同频率的光折射率不同&#xff0c;导致Color Shading&#xff0c;因此需要进行镜头阴影矫正&#xff08;Lens Shading Correction) 。 Lens shading分为两种 luma shading和color shadi…...

一区级光伏功率预测创新模型!CEEMDAN-KPCA-PINN多变量时序预测!完全自适应噪声集合经验模态分解+核主成份降维+物理信息神经网络

SCI配图创新模型&#xff01;完全自适应噪声集合经验模态分解核主成份降维物理信息神经网络&#xff01;CEEMDAN-KPCA-PINN多变量时序光伏功率预测&#xff0c;MATLAB代码。以下是对代码的全面分析&#xff1a; 一、主要功能 该代码用于光伏功率时间序列预测&#xff0c;结合了…...

在 CentOS Stream 9 上部署 OpenClaw(小龙虾)

在 CentOS Stream 9 上部署 OpenClaw&#xff08;小龙虾&#xff09; 注意&#xff1a;本人使用的普通用户安装 环境准备 # 1. 更新系统 sudo dnf update -y# 2. 安装基础工具 sudo dnf install -y gcc-c make cmake git curl wget vim执行官方安装脚本 脚本会自动安装 Node.js…...

C# 语言测验

C# 语言测验 引言 C#(读作“C sharp”)是一种由微软开发的高级编程语言,它旨在提供跨平台的开发能力,并广泛应用于桌面应用、移动应用、Web应用以及云服务等领域。为了帮助读者更好地理解和掌握C#语言,本文将提供一份全面的C#语言测验,旨在检验读者对C#基础知识的掌握程…...

迅雷怎么加快下载速度_现在迅雷下载怎么这么慢

迅雷限速怎么破解这个很简单&#xff0c;这个方法我还是在我朋友那里找到的。下载速度也是非常可以的。我让大家看一下。点我打开方法 这个就是我测试的速度。速度基本能跑到10M左右。宽带问题。下面开始今天的教学环节 打开上面图片中的地址&#xff0c;你会看到一个获取文件列…...

前端面试基础知识整理【Day-11】

前言 前端面试基础知识整理【Day-1】-CSDN博客 前端面试基础知识整理【Day-2】-CSDN博客 前端面试基础知识整理【Day-3】-CSDN博客 前端面试基础知识整理【Day-4】-CSDN博客 前端面试基础知识整理【Day-5】-CSDN博客 前端面试基础知识整理【Day-6】-CSDN博客 前端面试基…...

前端实现网页转PDF矢量文件,高清还原网页内容

前端&#xff1a;Vue3 后端&#xff1a;Node.js Express 接口 核心 PDF 引擎&#xff1a;Puppeteer&#xff08;谷歌 Chrome 官方无头浏览器&#xff09; 中文 100% 不乱码 图片 100% 显示 样式 1:1 还原 A4 自动分页&#xff0c;完美排版 文字可选中&#xff0c;矢量高清 ✅ …...

网络安全的进一步学习

了解基础网安知识分析第三方应用&#xff0c;进一步了解向日葵低版本被利用的条件&#xff0c;和木马能隐藏的原因&#xff08;通过计划任务定时运行实现持久化的运行&#xff09;和发现异常登录的记录并进行排查。...

JavaScript性能优化实战烈嘿

JavaScript性能优化实战技术文章大纲 性能优化的核心原则 减少代码执行时间 降低内存占用 优化网络请求 提升用户体验 代码层面的优化 避免全局变量污染&#xff0c;使用模块化或闭包 减少DOM操作&#xff0c;批量更新或使用文档片段 使用事件委托减少事件监听器数量 优化循环结…...

木马的排除与防护

作为学习者&#xff0c;我仅将所学知识进行系统梳理和总结。如有任何疏漏或错误&#xff0c;敬请指正进程、服务、启动项、计划任务的定义进程&#xff1a;操作系统中程序的一次执行实例&#xff0c;是资源分配和调度的基本单位。 服务&#xff1a;在后台运行的程序&#xff0c…...

我用 OpenClaw 7 天,砍掉了 80% 的重复沟通

我用 OpenClaw 7 天&#xff0c;砍掉了 80% 的重复沟通 很多人第一次接触 AI 助手&#xff0c;期待的是“无所不能”。 但真正把 AI 用起来之后&#xff0c;你会发现&#xff0c;最先产生价值的不是那些酷炫能力&#xff0c;而是那些你早就烦透了、却每天都还得做的重复工作。 …...

IDEA各版本支持的Java 版本和功能

https://www.jetbrains.com.cn/help/idea/supported-java-versions.html...

2.【.NET10 实战--孢子记账--产品智能化】--升级前的准备工作:项目依赖梳理与升级计划制定

我们在日常产品维护时&#xff0c;往往会遇到底层基础框架需要升级的情况&#xff0c;尤其是当底层框架升级到一个新的大版本时&#xff0c;可能会带来一些不兼容的变更&#xff0c;这时候我们就需要做好充分的准备工作&#xff0c;以确保升级过程顺利进行。从本文开始&#xf…...

064远程教育网站系统-springboot+vue

文末领取项目源码springbootvue 1.登录2.注册3.首页请文末卡片dd我获取源码...

Android 多进程开发 - FileDescriptor、Uri、AIDL 接口定义不能抛出异常

FileDescriptor 1、AIDL IMyAidlInterface.aidl&#xff0c;这里是位于 src/main/java/com/my/common 包下 package com.my.common;import android.os.ParcelFileDescriptor;interface IMyAidlInterface {ParcelFileDescriptor getFileDescriptor();void setFileDescriptor(in …...

KMP算法详解 [c++]

目录 前言 朴素的模式匹配算法 KMP模式匹配算法 KMP模式匹配算法的原理 next数组值的推导 KMP模式匹配算法的实现 KMP模式匹配算法的改进 nextval的推导 优化后的KMP模式匹配算法代码 零、前言 每年新闻周刊都会发布年度十大热词&#xff0c;这其实查询某个字符串在其…...