蓝桥杯备考随手记: 递归

递归是一种解决问题的方法,通过将原问题分解为更小的、相同形式的子问题来解决。在递归中,函数会调用自身来解决这些子问题,直到达到基本情况(终止条件),然后逐层返回结果,最终得到整个问题的解。

1. 递归的特点

  1. 自相似性:递归是一种自相似的结构,原问题和子问题具有相同的形式,只是规模不同。
  2. 分治思想:递归将一个大问题分解为更小的子问题,通过解决这些子问题来解决原问题。
  3. 基本情况:递归函数必须包含一个或多个基本情况(终止条件),用于结束递归调用并返回结果,避免无限递归。

2. 递归的应用

  1. 树形结构:递归常用于处理树形结构,如二叉树的遍历、查找等操作。
  2. 分治算法:分治算法通常使用递归来将问题分解为更小的子问题,如归并排序、快速排序等。
  3. 动态规划:动态规划中的递归可以用来定义子问题之间的关系,实现状态转移方程。
  4. 回溯算法:回溯算法也是一种递归的应用,通过不断尝试可能的选择来解决问题。

3. 递归的优缺点

  1. 优点:递归通常代码简洁易懂,能够自然地表达问题的分解和解决过程。
  2. 缺点:递归可能会导致堆栈溢出(stack overflow)等问题,因为每次递归调用都会占用一定的内存空间。另外,递归的效率可能不如迭代,因为递归调用函数时会有一定的开销。

4. 执行过程

一个典型的例子是计算阶乘。阶乘的定义是n! = n * (n-1)!,其中0! = 1。可以看出,阶乘问题可以通过将其分解为更小的阶乘问题来解决,直到达到基本情况(0! = 1)。下面是一个使用递归实现计算阶乘的函数:

public static int factorial(int n) {// 基本情况if (n == 0) {return 1;}// 递归关系return n * factorial(n - 1);}

递归函数的调用过程如下:

  1. 当调用factorial(4)时,n的值为4,返回4 * factorial(3);
  2. 当调用factorial(3)时,n的值为3,返回3 * factorial(2);
  3. 当调用factorial(2)时,n的值为2,返回2 * factorial(1);
  4. 当调用factorial(1)时,n的值为1,返回1 * factorial(0);
  5. 当调用factorial(0)时,n的值为0,满足基本情况,返回1。

递归函数会一直调用自己,直到达到基本情况,然后逐层返回结果,最终得到所需的阶乘结果。

5. 数学应用 

在数学中,递归通常用数学公式或方程来表示。一般来说,递归数学表达式包含两部分:基本情况和递归情况。

  1. 基本情况:基本情况是递归定义中的结束条件,通常是一个已知的值或表达式,用于终止递归过程。

  2. 递归情况:递归情况描述了如何通过递归调用来计算问题的解。递归情况通常包含一个或多个自身调用的表达式,用于将问题分解为更小的子问题。

数学中的递归定义通常使用数学符号和函数来表示。例如,斐波那契数列就是一个经典的递归数学定义,可以表示为:

  • 基本情况:F(0)=0,F(1)=1
  • 递归情况:F(n)=F(n−1)+F(n−2),其中n≥2

这个定义说明斐波那契数列的第n个元素可以通过前两个元素的和来计算,直到达到基本情况。

 以下是使用Java代码示范使用递归解决斐波那契数列的例子:

public class Fibonacci {public static int fibonacci(int n) {// 基本情况if (n <= 1) {return n;}// 递归情况return fibonacci(n - 1) + fibonacci(n - 2);}public static void main(String[] args) {int n = 10;System.out.println("斐波那契数列的第 " + n + " 个数是:" + fibonacci(n));}
}

6. 递归优化

记忆化递归是一种优化递归算法的方式,通过存储已计算的结果,避免重复计算相同的子问题。具体步骤包括:

  1. 定义存储结构:选择合适的数据结构(如数组、哈希表)存储计算结果。
  2. 编写递归函数:在递归函数中添加对存储结构的查询和更新操作,实现记忆化计算。
  3. 终止条件:定义递归的终止条件,确保正确结束递归过程。
  4. 使用存储结构:在递归函数中查询存储结构,避免重复计算,提高算法效率。

记忆化递归能够显著提高递归算法的效率,减少计算开销,特别适用于存在重复子问题的情况。通过记忆化递归优化,可以将指数级别的时间复杂度降低为多项式级别,提高算法的性能和效率。

以下是一个使用Java实现记忆化递归的示例,解决斐波那契数列问题: 

import java.util.HashMap;
import java.util.Map;public class MemoizationExample {// 创建一个Map用于存储已计算的结果private static Map<Integer, Integer> memo = new HashMap<>();// 计算斐波那契数列的方法public static int fibonacci(int n) {// 如果n小于等于1,直接返回nif (n <= 1) {return n;}// 如果已经计算过位置为n的结果,直接返回if (memo.containsKey(n)) {return memo.get(n);}// 否则进行递归计算,并将结果存储在memo中int result = fibonacci(n - 1) + fibonacci(n - 2);memo.put(n, result);return result;}public static void main(String[] args) {int n = 10;// 计算斐波那契数列第10个位置的值int result = fibonacci(n);System.out.println("斐波那契数列第" + n + "个位置的值为: " + result);}
}

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

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

相关文章

vscode开发小程序项目并在微信开发者工具运行

需求&#xff1a;vscode开发uniapp之后在微信开发者工具运行&#xff0c;更改的时候微信开发者也同步更改 创建微信小程序所需插件&#xff0c;在vscode的插件管理里面安装就可以了 1.微信小程序开发工具 2.vscode weapp api 3.vscode wxml 4.vscode wechat 1.创建小程序命…

vue3的 watch

两个例子中&#xff0c;主要区别在于监视的对象不同 watch( tablelist.value, () > { console.log(tablelist.value, "tablelist"); }, { deep: true }, ); watch 监视的是 tablelist.value 的值。也就是说&#xff0c;当 tablelist.value 发生变化时&#xff0c…

[HDCTF 2023]Normal_Rsa(revenge)(素数分解)

题目&#xff1a;&#xff08;注释为分析&#xff09; from Crypto.Util.number import * #from shin import flagmbytes_to_long(bHDCTF{******}) e65537 pgetPrime(256) qgetPrime(512) rgetPrime(512) np*q*r## phi(p-1)*(q-1)*(r-1) Ppow(p,2,n)## Pp**2 piroof(P,2) Qpo…

前端md5校验文件

前端获取文件的md5值&#xff0c;与文件一同传到后端&#xff0c;后端同样对md5值进行校验。如果相同&#xff0c;则文件未被损坏&#xff08;其实这种方式优点类似于tcp、ip的差错校验&#xff0c;好像token也是这种方式&#xff09; 项目准备 前端并不可能手写一个算法来实…

python新特性

字符串格式化输出 字符串格式化输出 formatted字符串是带有f字符前缀的字符串&#xff0c;可以很方便的格式化字符串 #旧版本 name 泉信 print(公司是&#xff1a; %s%name) print(公司是&#xff1a; {}.format(name)) #新版本 print(f欢迎加入&#xff1a; {name}) lang…

c++学生排名表(析构函数)

现在输入一批学生&#xff08;人数大于0且不超过100&#xff09;的名次和他们的姓名。要求按名次输出每个人的排名。 输入格式&#xff1a;每行为一个学生的信息&#xff0c;共两项&#xff0c;第一项为排名&#xff08;为正整数&#xff0c;且任意两名学生的排名均不同&#…

2024年武汉中级工程师评审学历、论文、业绩有什么要求?

2024年大部分地区职称申报已经开始&#xff0c;今年因为政策变动&#xff0c;基本上需要全员参加水平能力测试&#xff0c;水测通过之后安排评审&#xff0c;那么对于中级职称评审有什么要求呢&#xff1f;我们一起跟甘建二看看。 一、2024年武汉中级工程师职称评审学历要求&am…

Web前端—属性描述符

属性描述符 假设有一个对象obj var obj {a:1 }观察这个对象&#xff0c;我们如何来描述属性a&#xff1a; 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符 var desc Object.getOwnPropertyDescriptor(obj, a); console.log(desc);我…

安卓逆向 | 某X游戏垂类Web nonce

*本案例仅做分析参考,如有侵权请联系删除 1.逻辑分析 通过XHR断点,然后逐步往上调发现nonce生出处。 在console执行下函数 其中 i,是当前日期和时间的秒级时间戳,并将其向下取整到最接近的整数。 i = ~~(+_.w() / 1e3)w</

设计模式之迭代器模式(上)

迭代器模式 1&#xff09;概述 1.概念 存储多个成员对象&#xff08;元素&#xff09;的类叫聚合类(Aggregate Classes)&#xff0c;对应的对象称为聚合对象。 聚合对象有两个职责&#xff0c;一是存储数据&#xff0c;二是遍历数据。 2.概述 迭代器模式(Iterator Patter…

Go语言不能常量取址!?

题如下图 在软件开发中&#xff0c;常量是一种重要的编程元素&#xff0c;它们在程序中起到固定值的作用被大量使用 Go语言中的常量取址 在 Go 语言中&#xff0c;常量是无法被取址的。这意味着我们不能使用取址操作符 & 来获取常量的地址。例如&#xff1a; const a …

【Java EE】关于Spring MVC 响应

文章目录 &#x1f38d;返回静态页面&#x1f332;RestController 与 Controller 的关联和区别&#x1f334;返回数据 ResponseBody&#x1f38b;返回HTML代码片段&#x1f343;返回JSON&#x1f340;设置状态码&#x1f384;设置Header&#x1f338;设置Content-Type&#x1f…

MySQL高级(索引分类-聚集索引-二级索引)

目录 1、主键索引、唯一索引、常规索引、全文索引 2、 聚集索引、二级索引 3、回表查询 4、通过id查询和通过name查询那个执行效率高&#xff1f; 5、 InnoDB主键索引的 B tree 高度为多高呢&#xff1f; 1、主键索引、唯一索引、常规索引、全文索引 在MySQL数据库&#xff0c…

[【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

微信小程序picker设置了系统年度,打开选择年份从1年开始显示

背景&#xff1a;开发微信小程序时&#xff0c;使用了picker组件&#xff0c;设置值为当前系统时间年份&#xff0c;可以正常回显年份。但是打开面板选择年份的时候&#xff0c;默认从一年开始显示的。如下图所示。 原因&#xff1a;因为绑定的年份字段为Number类型。 解决方案…

文心一言 vs. GPT-4: 全面比较

1. 训练数据和预训练 文心一言 训练数据&#xff1a;文心一言是由中国研究人员开发的中文语言模型。它主要在大量古典中文文学作品上进行训练&#xff0c;包括诗歌、散文和历史文本。这些文学作品涵盖了丰富的中文语言和文化&#xff0c;使得文心一言在传统文化方面具有独特优…

React中State管理的4 个关键解决方案

在 React 应用开发中,状态(state)管理是非常重要的一部分。合理地管理状态可以确保组件的行为正确,提高应用的可维护性和性能。然而,在实际使用 React 的 state 时,开发者常常会遇到一些常见的问题和陷阱。 本文将从解决问题的角度,总结 React 中 state 管理的4个关键技巧: 使…

面向对象知识汇总(5)

目录 Day 5问题二十二&#xff1a;抽象类1. 抽象类概念2. 抽象类语法3. 抽象类特性4. 抽象类和普通类的区别 问题二十三&#xff1a;接口1. 接口的概念2. 接口的语法规则3. 接口的使用4. 接口的特性5. 实现多个接口6. 接口间的继承 Day 5 问题二十二&#xff1a;抽象类 1. 抽…

考研总计划篇

政治 九月份开始听徐涛老师的课&#xff0c;只需要听哲学&#xff0c;政治&#xff0c;经济学即可&#xff0c;然后用仓盾小程序刷题&#xff0c;刷题就吃饭的时候刷就是了。 工具书—苏一的提分手册&#xff0c;每天抽一个小时刷刷上面的知识点。 英语&#xff08;现在到九…