递归算法及经典例题详解

news2024/10/7 15:26:41

大部分人在学习编程时接触的第一个算法应该就是递归了,递归的思想其实很好理解,就是将一个问题拆分为若干个与本身相似的子问题,通过不断调用自身来求解。

但很多新手在实际操作中却很难正确使用到递归,有时面对问题还会有种无从下手的感觉,在此,我总结了一些解决递归问题的方法和思路,希望对你能有所帮助。

1.什么是递归

递归简单来说就是在运行过程中不断调用自己,直到碰到终止条件,返回结果的过程。

递归可以看作两个过程,分别是递和归。递就是原问题把要计算的结果传给子问题;归则是子问题求出结果后,把结果层层返回原问题的过程。

下面设一个需要经过三次递归的问题,为大家详细看一下递归的过程:
在这里插入图片描述
当然,现实中我们遇到递归问题是不会按照图中一样一步一步想下来,主要还是要掌握递归的思想,找到每个问题中的规律。

2.什么时候使用递归

递归算法无外乎就是以下三点:
1.大问题可以拆分为若干小问题
2.原问题与子问题除数据规模不同,求解思路完全相同
3.存在递归终止条件

而在实际面对递归问题时,我们还需要考虑第四点:当不满足终止条件时,要如何缩小函数值并让其进入下一层循环中

3.递归的实际运用(阶层计算)

了解了大概的思路,现在就要开始实战了。下面我们来看一道经典例题:

求N的阶层。

首先按照思路分析是否可以使用递归算法:

  1. N!可以拆分为(N-1)!*N
  2. (N-1)!与N!只有数字规模不同,求解思路相同
  3. 当N=1时,结果为1,递归终止

满足条件,可以递归:

 public static int Factorial(int num)
    {
        if(num==1)
        {
            return num;
        }
        return num*Factorial(num-1);
    }

而最后的return,便是第四步,缩小参数num的值,让递归进入下一层。

一般来说,第四步往往是最难的,需要弄清该如何缩小范围,如何操作返回的数值,这一步只能通过不断地练习提高了(当然如果你知道问题的数学规律也是可以试出来的)。

4.其它递归例题:

一:顺序打印,当输入一个整数时,按顺序依次打印每一位的值

该题可以理解为不断拆分整数的最大位,并将它们一一打印。与求阶层不同的是,该题的递归是在终止条件里进行的。

令num不断除10,最后只剩下最高位时并打印。

而在输出时%10,是因为当最高位打印返回后,继续打印的数不一定是个位数,%10只保留个位。

public static void PrintNumber(int num)
    {
        if (num>10)
        {
            PrintNumber(num/10);
        }
        System.out.print(num%10+",");
    }

二:斐波那契数列:有一个数列:1、1、2、3、5、8、13、21、34…,求该数列的第 n 项的值是多少。

有了以上两个例子,这样的递归问题就很好解决了。

首先我们观察斐波那契数列的规律是N=(N-1)+(N-2),要保证返回值不为0,所以有两个终止条件。

public static int Fibonacci(int num)
    {
        if (num==1||num==2)
        {
            return 1;
        }
        return Fibonacci(num-1)+Fibonacci(num-2);
    }

之后让我们再来看看递归的应用问题,与数学问题相比,在做应用题前需要先将题转换为数学问题,找到规律后再进行代码编写。

三 :汉诺塔(Tower of Hanoi)源于印度传说中一个古老的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔问题算是递归算法的经典例题了,很多初学者的入门题就是它。

在刚看到汉诺塔的时候,相信很多人都是一头雾水,不知道如何下手。其实面对应用题的时候,先建立它的模型,弄清题意后,再寻找其中的数学规律,解题思路便会清晰不少。

1.首先,题目的意思就是一个柱子A上有64的按大小顺序放置的圆片,要全部移动到另一根柱子C上,每次只能移动一个,可以借助柱子B,且小的不能在大的下面。求最少的移动次数
在这里插入图片描述

2.然后,寻找其中的数学规律(数学归纳法)。
先让所有圆片从上到下按1到N排序。

当N=1时,只需从A->C,移动1次。
当N=2时,先让1号从A->B,再让2号从A->C,最后让1号从B->C,移动3次。
当N=3时,可以理解为先让1、2号从A->B,再让3号从A->C,最后让1、2号从B->C。因为由N=2可以得知,移动两片需要3次,而A->B,B->C共进行了两次,所以共有6次,再加上3号A->C的过程,要移动7次。
同理,当N=4时,共要移动2×7(N=3的移动次数)+1=15次。

所以,当N=N时,要移动2×(N-1)的移动次数+1次
(其实也可以看做2的N次方-1

至此,得到了该题的规律,代码便好些多了。

public static int TowerOfHanoi(int num)
    {
        if (num==1)
        {
            return 1;
        }
        return TowerOfHanoi(num-1)*2+1;
    }

四:青蛙跳台阶问题:一只青蛙一次可以跳1级或2级台阶,求该青蛙跳N级的台阶总共有多少种跳法。

有了汉诺塔的经验,这道题做起来就很顺利了
先分析题意,再总结数学规律(本题题意简单,就直接开始数学归纳了)

当N=1,1种跳法。
当N=2,2种跳法。
当N=3,青蛙第一次跳的时候,它只有两种选择:跳1级,剩两级台阶,即N=2,有2种跳法;跳2级,剩一级台阶,即N=1,1种跳法。 所以,N3的跳法=N2+N1。
所以,N4=N3+N2

其实现在你一定会发现,青蛙跳台阶问题和斐波那契额数列的数学规律是一样的,分析清楚之后,代码也就写出来了:

public static int FrogJumpSteps(int num)
    {
        if (num==1)
        {
            return 1;
        }
        if (num==2)
        {
            return 2;
        }
        return FrogJumpSteps(num-1)+FrogJumpSteps(num-2);
    }

5.总结

到此,基本把递归算法的基础为大家讲了一遍。当然,我说的只是最基础的部分,递归算法在之后还有很多变式,如:如何避免重复运算,如何自下而上操作等等。

最后,祝大家在编程的道路上越走越远。
大鹏一日同风起,扶摇直上九万里。

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

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

相关文章

win7下java环境搭建以及jdk环境变量配置

很多人在搭建页游、手游时候经常遇到JAVA闪退,基本都是环境变量或者路径错误导致的。本章节主要讲解在win7系统环境下,java环境变量配置方法,java环境配置正确,才可以对apk程序进行反编译运行页游手游。其他操作系统环境变量大同小异参考下就会了。 安装教程: 1、直接运…

让语言学习更简单的 WordFlow

作为一个英语并不是那么特别好的计算机专业学生,长期积累英语的学习对个人发展还是有意义的。简单来说,我在语言上最大的两个问题,一个自己「不理解」,另一个是自己「不会表达」。 上述两个问题主要体现在口语层面,而…

1997-2021年全国30省技术市场成交额(亿元)

1997-2021年全国30省技术市场成交额 1、时间:1997-2021年 2、范围:30省不含西藏 3、来源:国家统计J 4、指标:技术市场成交额 5、缺失情况说明:无缺失 6、指标解释及用途: 技术市场成交额是一个客观、…

YOLOv5 训练自己的数据集

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍖 原作者:K同学啊|接辅导、项目定制 ● 难度:夯实基础⭐⭐ ● 语言:Python3、Pytorch3 ● 时间:5月1日-5月6日 🍺要求&#xff1…

基于C#开发 B/S架构的实验室管理系统 云LIS系统(MVC + SQLserver + Redis)

一、云LIS系统是将各种样本、免疫、临检、放免、及实验用的分析仪器,通过网络管理和传输实验分析过程中全部数据。对每一专业,实现检验申请、样本采集、样本核收、联机检验、质量控制、报告审核到报告发布的全环节的信息化管理平台。 二、基于B/S架构的云…

【SpringMVC】| SpringMVC注解式开发

目录 一:SpringMVC注解式开发 1. RequestMapping定义请求规则 2. 五种数据提交的方式 3. 请求参数中文乱码解决 4. action方法的返回值 5. SpringMVC的四种跳转方式 6. SpringMVC支持的默认参数类型 7. 日期处理 8. 标签的使用 9. 资源在WEB-INF目录下 一…

常见三种编码方式

常见三种编码方式 1. one-hot 编码2. 虚拟编码3. 效果编码 最近复习一些书,记录一下。在特征工程中,数据集经常会出现分类变量,这时候的分类变量可能是字符型,通常不能直接用于训练模型,这时需要对分类变量进行编码&am…

JavaWeb《CSS》

本笔记学习于Acwing平台 目录 1. 样式定义方式 2.1 行内样式表(inline style sheet) 2.2 内部样式表(internal style sheet) 2.3 外部样式表(external style sheet) 2. 选择器 2.1 标签选择器 2.2 …

ChatGPT服务器配置部署-chatGPT国内入口搭建

chatGPT国内入口 ChatGPT是由OpenAI公司开发的一种自然语言生成模型,国内入口一般是通过API接口或者SDK对接实现的。具体的对接方式可以参考以下步骤: 了解ChatGPT的API接口或者SDK: 首先需要了解ChatGPT提供的API接口或者SDK,包括使用方式、…

文件上传漏洞靶场

目录 第一关 源码 前端 后端 代码审计 前端 后端 绕过原理 抓包后未修改 抓包后修改且文件上传成功 第二关 源码 后端 代码审计 绕过原理 抓包后未修改 抓包后修改且文件上传成功 ​编辑 第三关 源码 后端 代码审计 绕过原理 第四关 源码 后端 代码审…

linux以太网(二)

内核版本:linux-3.14.16 基于imx6 一、文件fec_main.c分析 路径:drivers\net\ethernet\freescale\fec_main.c 1、platform总线 标准的平台总线使用方式 设备树匹配 设备树节点 2、平台总线probe 1)分配net_device相关结构 分配 与平…

单源最短路问题

全部代码 全部代码在github acwing 上 正在更新 https://github.com/stolendance/acwing 图论 欢迎大家star与fork 单源最短路问题 先用spfa算法 不行再换其他的 spfa-超级万能 说不定比dijsktra还快 dis[] 代表第k到某一点的最短距离 queue 代表刚被更新的点 它有可能更…

【Java校招面试】基础知识(三)——多线程与并发

目录 前言一、基础概念二、互斥锁三、Java内存模型(JMM)四、线程池后记 前言 本篇主要介绍Java多线程与并发相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第三篇博文,如有需要,可: 点击这里&a…

每日一题——反转字符串—II

每日一题 反转字符串——II 题目链接 思路 我们先来举几个例子来理解题目意思 字符串“ abcdefgh ”,k 2,那么依据题目意思,反转后的字符串应该是“ bacdfegh ”(即每2k个字符,就反转前k个字符,且无剩余…

基于 Python+Flask+SQLite 的网易云音乐评论情感分析系统

基于 PythonFlaskMySQL 的网易云音乐评论情感分析系统,采用Echart构建图表,支持一键切换颜色主题,通过连接数据库获取评论数据。对失效的爬虫代码进行了更新,可通过歌曲id_半_自动获取评论,具体可以看下方的过程展示。…

展望Flink各版本及新特性

展望Flink各版本及新特性 一 Flink 1.9 版本1.1 细粒度批作业恢复1.2 State Processor API1.3 Stop-with-Savepoint1.4 新 Blink SQL 查询处理器预览1.5 Table API / SQL 的其他改进 二 Flink 1.10 [重要版本 : Blink 整合完成]2.1 内存管理及配置优化2.2 统一的作业提交逻辑2.…

图像去噪简单介绍—并给出示例代码

文章目录 图像去噪简单介绍—并给出示例代码去噪的基本原理常见的噪声类型高斯噪声椒盐噪声马赛克噪声脉冲噪声 添加噪声的代码添加高斯噪声添加椒盐噪声 noise_pic常用的去噪方法均值滤波中值滤波高斯滤波双边滤波基于深度学习的图像去噪 总结图片来源 图像去噪简单介绍—并给…

Win11如何下载安装java?

一、问题描述 我在复现论文代码的时候,遇到了这样的问题: 我没有下载java,那么该如何解决呢? 下载 Java 的作用是为了能够在计算机上运行使用 Java 语言编写的应用程序。Java 是一种广泛使用的编程语言,可用于开发各…

【leetcode刷题总结】——代码随想录(数组总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。 以下是个人刷题总结,…

多线程编程的安全问题和解决措施

线程不安全的概念 由于多线程并发执行,导致结果出错,我们称这种线程是不安全的。 多线程编程出错的原因 一:线程之间并发执行的随机性导致线程不安全 二:多个线程对同一个对象进行修改 三:线程的操作不是原子性的…