数据结构与算法-递归

单路递归

二分查找

/*** 主函数:执行二分查找。* * @param a 要搜索的数组(必须是已排序的)* @param target 目标值* @return 返回目标值在数组中的索引;如果未找到,则返回 -1*/
public static int binarySearch(int[] a, int target) {// 从数组的第一个元素到最后一个元素开始查找return recursion(a, target, 0, a.length - 1);
}/*** 辅助递归函数:执行实际的二分查找操作。* * @param a 要搜索的数组* @param target 目标值* @param i 左边界索引* @param j 右边界索引* @return 返回目标值在数组中的索引;如果未找到,则返回 -1*/
public static int recursion(int[] a, int target, int i, int j) {// 如果左边界索引大于右边界索引,说明没有找到目标值if (i > j) {return -1;}// 计算中间点,使用无符号右移避免溢出int m = (i + j) >>> 1;// 检查中间点的值是否等于目标值if (target < a[m]) {// 如果目标值小于中间点的值,在左半部分继续查找return recursion(a, target, i, m - 1);} else if (a[m] < target) {// 如果目标值大于中间点的值,在右半部分继续查找return recursion(a, target, m + 1, j);} else {// 找到目标值,返回其索引return m;}
}

冒泡排序

/*** 优化版冒泡排序的递归实现。* * @param a 要排序的数组* @param low 排序范围的起始索引(包含)* @param high 排序范围的结束索引(包含)*/
private static void bubble(int[] a, int low, int high) {// 如果起始索引等于结束索引,说明已经没有需要排序的部分了,直接返回if(low == high) {return;}int j = low; // 初始化j为low,用于记录最后一次交换的位置// 遍历从low到high-1的元素for (int i = low; i < high; i++) {// 如果当前元素大于下一个元素,则交换它们的位置if (a[i] > a[i + 1]) {swap(a, i, i + 1); // 调用swap方法交换元素j = i; // 更新最后一次交换的位置}}// 递归调用bubble方法,继续对未排序部分进行排序// 注意:这里使用j而不是high作为新的high值,因为j之后的元素已经是有序的bubble(a, low, j);
}/*** 交换数组中两个元素的位置。* * @param a 要操作的数组* @param i 第一个元素的索引* @param j 第二个元素的索引*/
private static void swap(int[] a, int i, int j) {int t = a[i]; // 暂存第一个元素a[i] = a[j];  // 将第二个元素赋值给第一个位置a[j] = t;     // 将暂存的第一个元素赋值给第二个位置
}

插入排序

/*** 插入排序的递归实现。* * @param a 要排序的数组* @param low 排序范围的起始索引(包含)* @param high 排序范围的结束索引(包含)*/
private static void insertion(int[] a, int low, int high) {// 基本情况:如果low大于high,说明已经没有需要排序的部分了,直接返回if (low > high) {return;}// 保存当前元素值,并从low-1位置开始向前遍历int t = a[low];int i = low - 1;// 向前遍历数组,找到t应该插入的位置while (i >= 0 && a[i] > t) {  // 修正比较条件为a[i] > ta[i + 1] = a[i];           // 将较大的元素向后移动i--;}// 如果找到了一个比t小的位置,或者已经到达数组开头,则将t插入到正确位置if (i + 1 != low) {a[i + 1] = t;}// 递归调用insertion方法,处理下一个元素insertion(a, low + 1, high);
}

 多路递归

斐波那契数列-Leetcode 509

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

 

/*** 计算第n个斐波那契数。* * @param n 斐波那契数列中的位置(从0开始)* @return 第n个斐波那契数*/
public static int fib(int n) {// 基本情况1:当n为0时,返回0if (n == 0) {return 0;}// 基本情况2:当n为1时,返回1if (n == 1) {return 1;}// 递归调用:计算第n个斐波那契数,它是前两个斐波那契数之和return fib(n - 1) + fib(n - 2);  // 修正方法名从f改为fib
}

杨辉三角-Leetcode 118

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

 

import java.util.ArrayList;
import java.util.List;class Solution {/*** 生成帕斯卡三角形的前 numRows 行。** @param numRows 帕斯卡三角形的行数* @return 包含帕斯卡三角形各行的列表*/public List<List<Integer>> generate(int numRows) {List<List<Integer>> triangle = new ArrayList<>();if (numRows <= 0) {return triangle;}// 逐行构建帕斯卡三角形for (int i = 0; i < numRows; i++) {List<Integer> row = new ArrayList<>(i + 1);// 每一行的第一个和最后一个元素总是 1for (int j = 0; j <= i; j++) {if (j == 0 || j == i) {row.add(1);} else {// 当前行的元素是上一行相邻两个元素之和row.add(triangle.get(i - 1).get(j - 1) + triangle.get(i - 1).get(j));}}triangle.add(row);}return triangle;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/894985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Termux安装ssh实现电脑ssh

Termux下载 点击下载 在 Termux 中安装并使用 SSH&#xff0c;按照以下步骤操作&#xff1a; 1. 更新软件包列表 pkg update && pkg upgrade2. 安装 OpenSSH pkg install openssh3. 设置 SSH 密码&#xff08;必须&#xff0c;否则无法使用 SSH 服务器&#xff09…

深入理解 C++17 std::is_swappable

文章目录 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的变体注意事项结论 深入理解 C17 std::is_swappable 引言 在 C 编程中&#xff0c;交换两个对象的值是一个常见的操作。为了确保代码的通用性和安全性&am…

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上&#xff0c;其内部结构如图4-1所示。作为单一芯片的计算机&#xff0c;它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU&#xff0c;由运算器和控制器两个部分构成&#xff1b;…

w~Transformer~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太强~~ DeepMind 表示&#xff0c;他们提出的算法蒸馏&#xff08;AD&#xff09;是首个通过对具有模仿损失的离线数据进行顺序建模以展示上下文强化学习的方法。同时基于观察…

c#对接deepseek 聊天AI接口

注意&#xff1a;不是免费 对接文档&#xff1a;对话补全 | DeepSeek API Docs 注册地址&#xff1a;DeepSeek 申请key 在线请求示例 apifox deepseek - deepseek

23.PPT:校摄影社团-摄影比赛作品【5】

目录 NO12345​ NO6 NO7/8/9/10​ 单元格背景填充表格背景填充文本框背景填充幻灯片背景格式设置添加考生文件夹下的版式 NO12345 插入幻灯片和放入图片☞快速&#xff1a;插入→相册→新建相册→文件→图片版式→相框形状→调整边框宽度左下角背景图片&#xff1a;视图→…

创新领先!珈和科技获评省级企业技术中心

为充分发挥中小企业创新主体作用&#xff0c;提高自主创新、集成创新和引进消化吸收再创新能力&#xff0c;增强创新驱动发展的动力&#xff0c;做好专精特新“小巨人”企业的培育工作。 近日&#xff0c;湖北省经信厅对申报2024年湖北省中小企业技术中心的企业进行审核认定并…

初次体验Tauri和Sycamore (2)

原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创时间&#xff1a;2025年2月8日&#xff08;首次发布时间&#xff09; 原创链接&#xff1a;https://blog.csdn.net/liigo/article/details/145520637 版权所有&#xff0c;转载请注明出处。 关键词&#xff1a;Sy…

vs封装dll 给C#使用

一&#xff0c;vs创建控制台应用 创建控制台应用得好处时&#xff0c;我们可以自己测试接口&#xff0c;如果接口没有问题&#xff0c;改成dll重新编译一遍就可以。 二&#xff0c; 创建一个c 类&#xff0c;将所需提供得功能 封装到类中。 这样可以将 所有功能&#xff0c;进…

紧跟潮流,将 DeepSeek 集成到 VSCode

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源代码编辑器&#xff0c;自 2015 年发布以来&#xff0c;凭借其轻便、强大、且拥有丰富扩展生态的特点&#xff0c;迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统&#xff0c;包…

html 列动态布局

样式说明&#xff1a; /* 列动态布局&#xff0c;列之间以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }

从O(k*n)到O(1):如何用哈希表终结多层if判断的性能困局

【前言】   本文将以哈希表重构实战为核心&#xff0c;完整展示如何将传统条件匹配逻辑(上千层if-else判断)转化为O(1)的哈希表高效实现。通过指纹验证场景的代码级解剖&#xff0c;您将深入理解&#xff1a;   1.哈希函数设计如何规避冲突陷阱   2.链式寻址法的工程实现…

第 26 场 蓝桥入门赛

3.电子舞龙【算法赛】 - 蓝桥云课 问题描述 话说这年头&#xff0c;连舞龙都得电子化&#xff01;这不&#xff0c;蓝桥村的老程序员王大爷突发奇想&#xff0c;用LED灯带和一堆传感器鼓捣出了一条“电子舞龙”&#xff0c;它能根据程序指令在村里的广场上“翩翩起舞”。 广…

0012—数组

存取一组数据&#xff0c;使用数组。 数组是一组相同类型元素的集合。 要存储1-10的数字&#xff0c;怎么存储&#xff1f; C语言中给了数组的定义&#xff1a;一组相同类型元素的集合。 创建一个空间创建一组数&#xff1a; 一、数组的定义 int arr[10] {1,2,3,4,5,6,7,8,…

详细教程 | 如何使用DolphinScheduler调度Flink实时任务

Apache DolphinScheduler 非常适用于实时数据处理场景&#xff0c;尤其是与 Apache Flink 的集成。DolphinScheduler 提供了丰富的功能&#xff0c;包括任务依赖管理、动态调度、实时监控和日志管理&#xff0c;能够有效简化 Flink 实时任务的管理和部署。通过 DolphinSchedule…

了解传输层TCP协议

目录 一、TCP协议段格式 二、TCP原理 1.确认应答 2.超时重传 3.连接管理 建立连接 断开连接 4.滑动窗口 5.流量控制 6.拥塞控制 7.延时应答 8.捎带应答 9.面向字节流 10.TCP异常情况 TCP&#xff0c;即Transmission Control Protocol&#xff0c;传输控制协议。人如…

idea 如何使用deepseek 保姆级教程

1.安装idea插件codegpt 2.注册deepseek并生成apikey deepseek 开发平台&#xff1a; DeepSeek​​​​​​​ 3.在idea进行codegpt配置 打开idea的File->Settings->Tools->CodeGPT->Providers->Custom OpenAI Chat Completions的URL填写 https://api.deepseek…

Linux之kernel(1)系统基础理论(1)

Linux之Kernel(1)系统基础理论(1) Author: Once Day Date: 2025年2月6日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux内核知识_Once-Day的…

【读书笔记·VLSI电路设计方法解密】问题46:什么是bug覆盖率

在IC设计项目的验证过程中&#xff0c;功能测试&#xff08;通过使用测试平台&#xff09;有助于定位设计错误或漏洞。这个验证过程有三个阶段&#xff1a;构建和启动测试平台、验证基本测试用例以及验证边界情况。 在前两个阶段&#xff0c;漏洞很容易被检测到&#xff0c;因…

【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表

目录结构如下&#xff1a; . ├── static │ ├── css │ │ └── styles.css │ └── js │ └── scripts.js ├── templates │ ├── base.html │ ├── case_converter.html │ ├── index.html │ └── word_finder.html ├── app.py ├── tree.py…