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

常见递归算法题目整理

常见递归算法题目整理

  • 一、单路递归
    • 1、阶乘计算
    • 2、翻转字符串
    • 3、二分查找
  • 二、多路递归
    • 1、斐波那契
      • 1)基础版
      • 2)缓存版
    • 2、汉诺塔
    • 3、杨辉三角
      • 1)基础版
      • 2)缓存版
      • 3)优化缓存版

)

一、单路递归

1、阶乘计算

public class 阶乘计算 {// 1*2*3....*100public static void main(String[] args) {System.out.println(num(10));}private static int num(int i) {if (i == 1 || i == 0) {return i;}return i * num(--i);}
}

2、翻转字符串

public class 翻转字符串 {public static void main(String[] args) {String str = "wrewtyu";f(str,0);}private static void f(String str, int index) {if (index == str.length()) {return;}f(str, index + 1);System.out.println(str.charAt(index));}
}

3、二分查找

public class 二分查找 {public static void main(String[] args) {int[] arr = {1, 2, 3, 5, 6, 7, 9, 22, 33, 66, 78, 81, 99, 100};int targetNum = 3;System.out.println(binarySearch(arr, targetNum, 0, arr.length));}private static int binarySearch(int[] arr, int targetNum, int left, int right) {if (left > right) {return -1;}int mid = (left + right) >>> 1;if (arr[mid] < targetNum) {return binarySearch(arr, targetNum, mid + 1, right);} else if (arr[mid] > targetNum) {return binarySearch(arr, targetNum, left, mid - 1);} else {return mid;}}
}

二、多路递归

1、斐波那契

1)基础版

public class FeiBoNaQieTest {public static void main(String[] args) {System.out.println(f(10));}private static int f(int n) {if (n == 1) {return 1;}if (n == 0) {return 0;}return f(n - 1) + f(n - 2);}
}

2)缓存版

基础版已经能够完成我们的目的,但是在计算每一项的时候会重复计算,比如在计算第8项和第9项的时候,都需要借助第7项,继而导致第7项重复计算。此处添加一个缓存数组cache,用于存放已经计算过的项,避免重复进行计算

public class FeiBoNaQieCacheTest {public static void main(String[] args) {int length = 18;// 1、将所有计算过的值缓存在数组中,避免重复计算int[] cache = new int[length + 1];// 2、默认都赋值为-1Arrays.fill(cache, -1);// 3、赋值前两项cache[0] = 0;cache[1] = 1;System.out.println(f(length, cache));}private static int f(int n, int[] cache) {if (cache[n] != -1) {// 曾经计算过return cache[n];}int i = f(n - 1, cache);int j = f(n - 2, cache);// 返回数据的同时将数据进行缓存cache[n] = i + j;return i + j;}
}

2、汉诺塔

public class HanNuotaTest {private static List<Integer> a = new LinkedList<>();private static List<Integer> b = new LinkedList<>();private static List<Integer> c = new LinkedList<>();public static void main(String[] args) {int n = 5;init(n);print();f(n, a, b, c);print();}/*** @param n 圆盘个数* @param a 源* @param b 借* @param c 目*/private static void f(int n, List<Integer> a,List<Integer> b,List<Integer> c) {if (n == 0) {return;}// 1、n个圆盘,将顶部n-1个圆盘,借助c,由a移动到bf(n - 1, a, c, b);// 2、将a移动到cInteger remove = a.remove(a.size() - 1);c.add(remove);// 如果是LinkedList,可以直接使用removeLast// c.add(a.removeLast());// 3、n个圆盘,将顶部n-1个圆盘,借助a,由b移动到cf(n - 1, b, a, c);}/*** 初始化汉诺塔集合** @param n 圆盘个数*/private static void init(int n) {for (int i = n; i > 0; i--) {a.add(i);}}/*** 打印哈诺塔内容*/private static void print() {System.out.println("---");System.out.println("a: " + a.toString());System.out.println("b: " + b.toString());System.out.println("c: " + c.toString());}
}

3、杨辉三角

1)基础版

public class YangHuiTest {public static void main(String[] args) {f(30);}/*** @param length 杨辉三角高度*/private static void f(int length) {if (length == 0) {return;}for (int i = 0; i < length; i++) {printSpace(length, i);for (int j = 0; j <= i; j++) {// 格式化打印元素占用位置宽度System.out.printf("%-4d", getElement(i, j));}System.out.println();}}/*** 打印每一行前面的空格,空格数与杨辉三角高度和元素位置有关系:(高度-1-位置下标)*2** @param length 杨辉三角高度* @param i      元素位置*/private static void printSpace(int length, int i) {int spaceNum = (length - 1 - i) * 2;for (int k = 0; k < spaceNum; k++) {// 这里与元素占用位置大小有关系(本demo为占用4个位置)System.out.print(" ");}}/*** 获取元素:(3,2)=(2,2)+(2,1),两边元素(i,j)、(0,j)都是1** @param i 横坐标* @param j 纵坐标* @return (i, j)坐标元素*/private static int getElement(int i, int j) {if (j == 0 || i == j) {return 1;}return getElement(i - 1, j - 1) + getElement(i - 1, j);}
}

2)缓存版

此处的缓存做法与斐波那契做法相同,使用一个二维数组存储杨辉三角的各个元素,我们在使用getElement方法获取元素的时候,可以直接去二维数组中获取,继而减少递归计算的次数

public class YangHuiCacheTest {public static void main(String[] args) {f(30);}/*** @param length 杨辉三角高度*/private static void f(int length) {if (length == 0) {return;}// 初始化一个二维数组 用于缓存集合(直接length,length太浪费空间)int[][] cache = new int[length][];for (int i = 0; i < length; i++) {// 二维数组的每一行长度为i+1cache[i] = new int[i + 1];printSpace(length, i);for (int j = 0; j <= i; j++) {// 格式化打印元素占用位置宽度System.out.printf("%-4d", getElement(cache, i, j));}System.out.println();}}/*** 打印每一行前面的空格,空格数与杨辉三角高度和元素位置有关系:(高度-1-位置下标)*2** @param length 杨辉三角高度* @param i      元素位置*/private static void printSpace(int length, int i) {int spaceNum = (length - 1 - i) * 2;for (int k = 0; k < spaceNum; k++) {// 这里与元素占用位置大小有关系(本demo为占用4个位置)System.out.print(" ");}}/*** 获取元素:(3,2)=(2,2)+(2,1),两边元素(i,j)、(0,j)都是1** @param i 横坐标* @param j 纵坐标* @return (i, j)坐标元素*/private static int getElement(int[][] cache, int i, int j) {if (cache[i][j] != 0) {return cache[i][j];}if (j == 0 || i == j) {cache[i][j] = 1;return 1;}cache[i][j] = getElement(cache, i - 1, j) + getElement(cache, i - 1, j - 1);return cache[i][j];}
}

3)优化缓存版

缓存版本将整个杨辉三角都进行了缓存,但是真实在计算的时候我们会发现,其实只需要缓存计算行的上一行数据即可,即以空间换时间的空间可以进行优化。此版本使用一个一级缓存进行缓存上一行的数据。

public class YangHuiCachePlusTest {public static void main(String[] args) {f(5);}/*** @param length 杨辉三角高度*/private static void f(int length) {if (length == 0) {return;}int[] row = new int[length];for (int i = 0; i < length; i++) {// 获取当前行。// 当前行的数据需要依赖row集合的数据,row集合的数据来源于上一次for循环赋值的结果createRow(row, i);// 二维数组的每一行长度为i+1printSpace(length, i);for (int j = 0; j <= i; j++) {// 格式化打印元素占用位置宽度System.out.printf("%-4d", row[j]);}System.out.println();}}/*** 打印每一行前面的空格,空格数与杨辉三角高度和元素位置有关系:(高度-1-位置下标)*2** @param length 杨辉三角高度* @param i      元素位置*/private static void printSpace(int length, int i) {int spaceNum = (length - 1 - i) * 2;for (int k = 0; k < spaceNum; k++) {// 这里与元素占用位置大小有关系(本demo为占用4个位置)System.out.print(" ");}}/*** 创建杨辉三角一行的数据*/private static void createRow(int[] row, int n) {if (n == 0) {row[0] = 1;return;}// 集合赋值只能由右往左赋值,从左往右i位置的值会被计算出来的新值覆盖for (int i = n; i > 0; i--) {row[i] = row[i] + row[i - 1];}}
}

相关文章:

常见递归算法题目整理

常见递归算法题目整理 一、单路递归1、阶乘计算2、翻转字符串3、二分查找 二、多路递归1、斐波那契1&#xff09;基础版2&#xff09;缓存版 2、汉诺塔3、杨辉三角1&#xff09;基础版2&#xff09;缓存版3&#xff09;优化缓存版 ) 一、单路递归 1、阶乘计算 public class …...

安全小记-Ngnix负载均衡

配置Ngnix环境 1.安装 创建Nginx的目录&#xff1a; mkdir /soft && mkdir /soft/nginx/ cd /home/centos/nginx下载Nginx安装包通过wget命令在线获取安装包&#xff1a; wget https://nginx.org/download/nginx-1.21.6.tar.gz解压Nginx压缩包&#xff1a; tar -x…...

CI/CD

介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…...

window下如何安装ffmpeg(跨平台多媒体处理工具)

ffmpeg是什么? FFmpeg是一个开源的跨平台多媒体处理工具&#xff0c;可以用于录制、转换和流媒体处理音视频。它包含了几个核心库和工具&#xff0c;可以在命令行下执行各种音视频处理操作&#xff0c;如剪辑、分割、合并、媒体格式转换、编解码、流媒体传输等。FFmpeg支持多…...

MySQL必看表设计经验汇总-上(精华版)

目录 1.命名要规范 2选择合适的字段类型 3.主键设计要合理 4.选择合适的字段长度 5.优先考虑逻辑删除&#xff0c;而不是物理删除 6.每个表都需要添加通用字段 7.一张表的字段不宜过多 前言 在数据库设计中&#xff0c;命名规范、合适的字段类型、主键设计、字段长度、…...

扫雷游戏(C语言)

目录 一、前言&#xff1a; 二、游戏规则&#xff1a; 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言&#xff1a; 用C语言完成扫雷游戏对于初学者来说&#xff0c;难度并不是很大&#xff0c;而且通…...

五、MySQL的备份及恢复

5.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数据…...

使用dockers-compose搭建开源监控和可视化工具

简介 Prometheus 和 Grafana 是两个常用的开源监控和可视化工具。 Prometheus 是一个用于存储和查询时间序列数据的系统。它提供了用于监控和报警的数据收集、存储、查询和图形化展示能力。Prometheus 使用拉模型&#xff08;pull model&#xff09;&#xff0c;通过 HTTP 协议…...

浏览器——HTTP缓存机制与webpack打包优化

文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制&#xff0c;修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…...

STM32duino舵机控制-2

使用定时器进行精确延时&#xff0c;串口接收数据进行 50 0度 --十六进制32 250 180度 --十六进制FA 串口接收到AA 32两个字节&#xff0c;舵机转到0度&#xff1b;接收到AA FA&#xff0c;转到180度。请验证代码&#xff1a; const unsigned…...

【知识---如何创建 GitHub 个人访问令牌】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言登录到 GitHub 帐户。在右上角的头像旁边&#xff0c;点击用户名&#xff0c;然后选择 "Settings"。在左侧导航栏中&#xff0c;选择 "Develope…...

GBASE南大通用分享-ConnectionTimeout 属性

GBASE南大通用分享 获取或设置连接超时时间&#xff0c;值为‚0‛时没有限制。  语法 [Visual Basic] Public Overrides ReadOnly Property ConnectionTimeout As Integer Get [C#] public override int ConnectionTimeout { get; }  实现 IDbConnection.Connecti…...

ChatGPT 全域调教高手:成为人工智能交流专家

随着人工智能的快速发展&#xff0c;ChatGPT作为一种强大的文本生成模型&#xff0c;在各行各业中越来越受到重视和应用。想要利用ChatGPT实现更加智能、自然的交流&#xff0c;成为 ChatGPT 全域调教高手吗&#xff1f;本文将为您介绍如何通过优化ChatGPT的训练方法&#xff0…...

5.Hive表修改Location,一次讲明白

Hive表修改Loction 一、Hive中修改Location语句二、方案1 删表重建1. 创建表&#xff0c;写错误的Location2. 查看Location3. 删表4. 创建表&#xff0c;写正确的Location5. 查看Location 三、方案2 直接修改Location并恢复数据1.建表&#xff0c;指定错误的Location&#xff0…...

基于springboot校园台球厅人员与设备管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括校园台球厅人员与设备管理系统的网络应用&#xff0c;在外国管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。校园台球厅人员与设备管理系统具…...

MySQL(下)

四、事务 一、概念 对数据库的一次执行中有多条sql语句执行。这多条sql在一次执行中&#xff0c;要么都成功执行&#xff0c;要么都不执行。保证了数据完整性。MySQL中只有innodb引擎支持事务。 二、特性 事务是必须满足 4 个条件&#xff08;ACID&#xff09;&#x…...

如何搭建开源笔记Joplin服务并实现远程访问本地数据

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…...

免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) &#xff0c;分享下哈。 项目视频演示 【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现)…...

后端学习:数据库MySQL学习

数据库简介 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。   接下来&#xff0c;我们来学习Mysql的数据模型&#xff0c;数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#xf…...

2024最新版IntelliJ IDEA安装使用指南

2024最新版IntelliJ IDEA安装使用指南 Installation and Usage Guide to the Latest JetBrains IntelliJ IDEA Community Editionn in 2024 By JacksonML JetBrains公司开发的IntelliJ IDEA一经问世&#xff0c;就受到全球Java/Kotlin开发者的热捧。这款集成开发环境&#xf…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...