数据结构与算法-递归

单路递归

二分查找

/*** 主函数:执行二分查找。* * @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.rhkb.cn/news/14851.html

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

相关文章

【STM32F1】一种使用通用定时器实现各个通道独立输出不同指定数量脉冲的方法

一种使用通用定时器实现独立通道输出指定数量脉冲的方法 一种使用通用定时器实现独立通道输出指定数量脉冲的方法概述实验平台配置步骤1. 初始化定时器与GPIO2. 设置定时器工作模式3. 编写脉冲计数逻辑4. 调整参数以满足要求注意事项 代码实现电机结构体配置&#xff0c;GPIO配…

【Java基础】序列化、反序列化和不可变类

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java基础面经 &#x1f4da;本系列文章为个…

android apk反编译

使用解压工具解压apk&#xff0c;使用dex2jar解析其中的dex文件为jar文件&#xff0c;再使用jd-gui将class反编译为java文件 1 工具下载 dex2jar下载 https://github.com/pxb1988/dex2jar/releases 直接去github上下载最新发布版本 注意&#xff0c;如果后面使用过程中遇到No…

PAT乙级( 1009 说反话 1010 一元多项式求导)C语言版本超详细解析

1009 说反话 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字母&#x…

C++20导出模块及使用

1.模块声明 .ixx文件为导入模块文件 math_operations.ixx export module math_operations;//模块导出 //导出命名空间 export namespace math_ {//导出命名空间中函数int add(int a, int b);int sub(int a, int b);int mul(int a, int b);int div(int a, int b); } .cppm文件…

鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.

鸿蒙项目接入支付宝后&#xff0c;运行提示error: install parse native so failed. 该问题可能由于设备支持的 Abi 类型与 C 工程中的不匹配导致. 官网error: install parse native so failed.错误解决办法 根据官网提示在模块build-profile.json5中添加“x86_64”依然报错 问…

MongoDB开发规范

分级名称定义P0核心系统需7*24不间断运行&#xff0c;一旦发生不可用&#xff0c;会直接影响核心业务的连续性&#xff0c;或影响公司名誉、品牌、集团战略、营销计划等&#xff0c;可能会造成P0-P2级事故发生。P1次核心系统这些系统降级或不可用&#xff0c;会间接影响用户使用…

nodejs - vue 视频切片上传,本地正常,线上环境导致磁盘爆满bug

nodejs 视频切片上传&#xff0c;本地正常&#xff0c;线上环境导致磁盘爆满bug 原因&#xff1a; 然后在每隔一分钟执行du -sh ls &#xff0c;发现文件变得越来越大&#xff0c;即文件下的mp4文件越来越大 最后导致磁盘直接爆满 排查原因 1、尝试将m3u8文件夹下的所有视…

微信小程序如何使用decimal计算金额

第三方库地址&#xff1a;GitHub - MikeMcl/decimal.js: An arbitrary-precision Decimal type for JavaScript 之前都是api接口走后端计算&#xff0c;偶尔发现这个库也不错&#xff0c;计算简单&#xff0c;目前发现比较准确 上代码 导入js import Decimal from ../../uti…

unity学习29:摄像机camera相关skybox 和 Render Texture测试效果

目录 1 摄像机 1.1 每个Scene里都自带一个摄像机 camera 1.2 可以创建多个camera 1.3 下面先看backgroundtype: 2 backgroundtype: 天空盒 skybox 2.1 清除标志,清除&#xff1a;天空盒 自选天空盒 2.2 window /Asset Store 2.3 导入skybox 3 backgroundtype: 纯色…

ximalaya(三) playUriList值解密--webpack

本文主要介绍解密音频播放url参数。 本文仅代表个人理解&#xff0c;如有其他建议可在评论区沟通。 声明 仅仅记录一下自己的学习方法&#xff0c;不作为其他参考、更不作为商业用途。如有侵犯请联系本人删除 目标地址&#xff1a;aHR0cHM6Ly93d3cueGltYWxheWEuY29tL3NvdW5k…

C# Winform怎么设计串口,客户端和相机控件界面显示

首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法&#xff0c;其中的节点&#xff08;Section)、键&#xff08;KEY&#x…

【redis】数据类型之hash

Redis中的Hash数据类型是一种用于存储键值对集合的数据结构。与Redis的String类型不同&#xff0c;Hash类型允许你将多个字段&#xff08;field&#xff09;和值&#xff08;value&#xff09;存储在一个单独的key下&#xff0c;从而避免了将多个相关数据存储为多个独立的key。…

Qt:Qt Creator项目创建

目录 认识Qt Creator Qt Creator概览 使用Qt Creator新建项目 选择项目模板 选择项目路径 选择构建系统 填写类信息设置界面 选择语言和翻译文件 选择Qt套件 选择版本控制系统 最终效果 认识Qt Creator Qt Creator概览 从开始菜单或者快捷方式打开Qt Creator集成开…

家用报警器的UML 设计及其在C++和VxWorks 上的实现01

M.W.Richardson 著&#xff0c;liuweiw 译 论文描述了如何运用 UML&#xff08;统一建模语言&#xff09;设计一个简单的家用报警器&#xff0c;并实现到 VxWorks 操作系统上。本文分两个部分&#xff0c;第一部分描述了如何用 UML 设计和验证家用报警器的模型&#xff0c;以使…

node.js + html + Sealos容器云 搭建简易多人实时聊天室demo 带源码

node.js html Sealos容器云 搭建简易多人实时聊天室demo 带源码 前言功能介绍&#xff08;demo演示&#xff09;sealos官网配置node.js 编写服务端代码前端ui 调用接口整体项目目录部署到服务器 前言 hello哦盆友们&#xff0c;这次我们来十几行代码做一个超简单的多人聊天…

CPP集群聊天服务器开发实践(一):用户注册与登录

目录 1 客户端用户注册与登录 1.1 主要思想 1.2 网络层 1.3 业务层 1.4 数据层 1.5 测试结果 1 客户端用户注册与登录 1.1 主要思想 实现网络层、业务层、数据层的解耦&#xff0c;提高系统的可维护性。 网络层&#xff1a;主要实现对客户端连接、客户端读写请求的捕获…

【C语言】数 组与指针:深度剖析与等价表达

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;数组与指针的基本关系&#x1f4af;数组与指针的互换使用数组下标与指针的等价性 &#x1f4af;六个表达式的等价性&#x1f4af;指针运算的注意事项&#x1f4af;数组…

寒假2.7

题解 web&#xff1a;[HCTF 2018]WarmUp 打开是张表情包 看一下源代码 访问source.php&#xff0c;得到完整代码 代码审计 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.p…

sqli-lab靶场学习(五)——Less15-17(post方法盲注、修改密码)

前言 第11-14关开始用post方法&#xff0c;15-17关会用到盲注&#xff0c;post方法盲注和get方法类似。 Less15 这关是单引号闭合&#xff0c;有报错但没有具体情况的回显&#xff0c;因此适合使用错误盲注。 在用户名密码框分别输入 账号&#xff1a;admin and 11 -- asd…