递归算法

news2024/12/24 2:00:08

递归算法

      • 概况
      • 步骤
      • 代码示例
      • 输出结果

概况

递归算法是一种通过在函数中调用自身来解决问题的方法。常用于解决需要重复执行相似操作的问题,例如树、图等数据结构的遍历,以及分治、动态规划等算法。

递归算法的基本思想是将大问题划分为一个或多个具有相同结构的子问题,并通过递归调用函数来解决这些子问题。每个子问题的解最终汇总起来,从而得到原始问题的解。

在实现递归算法时,需要定义递归的终止条件,也称为基本情况。当满足终止条件时,递归将不再进行,避免无限递归。否则,递归函数会继续调用自身,直到达到终止条件为止。

虽然递归算法可以简洁地解决某些问题,但它也可能导致性能问题。递归函数的调用过程中需要消耗额外的栈空间,如果递归层级过深,可能会导致栈溢出。因此,在使用递归算法时,需要谨慎设计,并确保递归层级不会过深。

步骤

力扣算法题

递归算法通常包含以下步骤:

  1. 定义基本情况:确定递归应该终止的条件。这是递归的停止点,防止无限递归。基本情况通常是一个简单的问题,可以直接求解,而不需要递归。

  2. 将大问题拆分为子问题:将原始问题分解为一个或多个具有相同结构的子问题。这是递归算法的核心思想。

  3. 提供递归调用:在函数中调用自身,以解决子问题。递归调用可以使用不同的输入参数,以便在每次递归调用中处理不同的子问题。

  4. 合并子问题的解:获取每个子问题的结果,并将它们合并成原始问题的解。在递归的每一层中,需要将子问题的解合并到最终的解中。

  5. 返回解:将最终的解返回给调用函数。

需要注意的是,递归算法在编写时需要注意递归层级的控制,确保不会因为递归层级过深而导致栈溢出的问题。此外,在设计递归算法时,应尽量避免重复计算相同的子问题,可以使用记忆化搜索或动态规划等方法进行优化。

代码示例

需求1:利用递归求1~100的和

需求2:利用递归求5的阶乘

例如:

package text.text02;

/*
递归算法:
    递归算法的基本思想是将大问题划分为一个或多个具有相同结构的子问题,并通过递归调用函数来解决这些子问题。每个子问题的解最终汇总起来,从而得到原始问题的解。
    
递归算法:(核心)
    1.找出口
    2.找规则

需求1:利用递归求1~100的和
    规律:1~100的和 = 100 + 1~99的和
         1~99的和 = 99 + 1~98的和
         1~98的和 = 98 + 1~97的和
         1~97的和 = 97 + 1~96的和
             ……………………
         1~3的和 = 3 + 1~2的和
         1~2的和 = 2 + 1~1的和
         1~1的和 = 1 (出口)
                
需求2:利用递归求5的阶乘
    5! = 5 * 4 * 3 * 2 * 1
    规律:5! = 5 * 4!
         4! = 4 * 3!
         3! = 3 * 2!
         2! = 2 * 1!
         1! = 1 (出口)
 */
public class text14A {
    public static void main(String[] args) {
        //调用getSum方法
        int sum = getSum(100);
        System.out.println("1~100的和为:" + sum);
        //调用factorial方法
        int num = factorial(5);
        System.out.println("5的阶乘为:" + num);
    }

    //定义递归方法求1~100的和
    public static int getSum(int number) {
        //出口:如果number=1,则返回方法
        if (number == 1) {
            return 1;
        }
        //如果number不等于1,则接着调用getSum方法
        else {
            int sum = number + getSum(number - 1);
            return sum;
        }
    }

    //定义递归方法求5的阶乘
    public static int factorial(int number) {
        //出口
        if (number == 1) {
            return number;
        }
        //如果number不等于1,则接着调用factorial方法
        else {
            int num = number * factorial(number - 1);
            return num;
        }
    }
}

输出结果

在这里插入图片描述

流程图解释:

对于 getSum() 方法:

          getSum(100)       
              ↓                 
     ┌─────┬─────┬─────┬─────┐ 
     ↓     ↓     ↓     ↓     ↓
  getSum(99) ...  getSum(2)  getSum(1)
    ↓         ↓         ↓
 getSum(98) ...  getSum(2)
    ↓         ↓         ↓
    ...       ...       ...
    ↓         ↓         ↓
 getSum(3)   getSum(2) getSum(1)
    ↓         ↓
 getSum(2)   getSum(1)
    ↓         ↓
 getSum(1)   Return 1

对于 factorial() 方法:

        factorial(5)
           ↓                 
     ┌─────┬─────┬─────┬─────┐ 
     ↓     ↓     ↓     ↓     ↓
  factorial(4) ...  factorial(2)  factorial(1)
    ↓         ↓         ↓
 factorial(3) ...  factorial(2)
    ↓         ↓         ↓
      ...       ...       ...
    ↓         ↓         ↓
 factorial(2)   factorial(1)
    ↓         ↓
factorial(1)  Return 1

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

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

相关文章

编译原理2.3习题 语法制导分析[C++]

图源:文心一言 编译原理习题整理~🥝🥝 作为初学者的我,这些习题主要用于自我巩固。由于是自学,答案难免有误,非常欢迎各位小伙伴指正与讨论!👏💡 第1版:自…

帝国cms无限级分销的逻辑思路效果展示以及表结构的初步规划

#小李子9479# #帝国cms无限级分销# #帝国cms三级分销系统# 关于分销系统 ,我们要解决以下几个重要的逻辑关系, 1,用户上下级关系,即A通过分享期邀请链接,B点击或扫码注册后,成为A的下线。 2。下级级别的…

从开发、部署到维护:SAAS与源代码小程序的全流程对比

在数字化时代,小程序已成为企业开展业务的重要工具。然而,小程序开发过程中存在多种形式,其中SAAS版本小程序和源代码小程序是最常见的两种。乔拓云SaaS系统作为业界领先的SaaS服务平台,为企业提供高效、便捷的小程序解决方案。与…

ctfshow反序列化(web254-web266)

目录 web254 web255 web256 web257 web258 web259 web260 web261 web262 web263 web264 web265 web266 web254 源码 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020…

Vulnhub靶机:FunBox 5

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox 5&#xff08;10.0.2.30&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/funb…

Window安装Python和开发Pycharm

准备&#xff1a; 1&#xff1a;安装Python环境 https://www.python.org/downloads/windows/ 2: 下载Pycharm https://www.jetbrains.com/pycharm/download/other.html

Java基础进阶01-类加载器,反射

目录 一、类加载器 1.概述 2.过程 &#xff08;1&#xff09;类加载时机 &#xff08;2&#xff09;类加载过程 加载 验证 准备 解析 初始化 3.分类 &#xff08;1&#xff09;启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff1a;虚拟机内置的类…

数据结构笔记1

来自《Python数据结构学习笔记》&#xff08;张清云 编著&#xff09; 第一章 数据结构基础 1.逻辑结构 集合&#xff1a;结构中的数据元素除了同属于一种类型外&#xff0c;别无其他关系线性结构&#xff1a;数据元素之间一对一的关系树形结构&#xff1a;数据元素之间一对…

Django入门,十分钟学会登录网页

我们假定你已经阅读了 安装 Django。你能知道 Django 已被安装&#xff0c;且安装的是哪个版本&#xff0c;通过在命令提示行输入命令 cmd黑窗口运行&#xff0c;不懂cmd百度一下 python -m django --version 如果没出现版本&#xff0c;就是没安装&#xff0c;那么用pip安装…

搭建Android开发环境—— 熟悉Android开发工具,掌握Android移动端开发环境的搭建、项目导入,并能够将项目部署到模拟器和真机进行测试。

搭建Android开发环境 一、实验目的 熟悉Android开发工具&#xff0c;掌握Android移动端开发环境的搭建、项目导入&#xff0c;并能够将项目部署到模拟器和真机进行测试。 二、实验设备及器件 1、JDK1.8安装包 2、Android Studio安装包 三、实验内容 完成JDK和Android Stud…

Tomcat 优化

1、隐藏版本信息 隐藏 HTTP 头部的版本信息 # 为 Connector 添加 server 属性 vim /usr/local/tomcat/conf/server.xml <Connector port"8080" protocol"HTTP/1.1" connectionTimeout"20000" redirectPort"8443" server"w…

应用机器学习的建议 (Advice for Applying Machine Learning)

1.决定下一步做什么 问题&#xff1a; 假如&#xff0c;在你得到你的学习参数以后&#xff0c;如果你要将你的假设函数放到一组 新的房屋样本上进行测试&#xff0c;假如说你发现在预测房价时产生了巨大的误差&#xff0c;现在你的问题是要想改进这个算法&#xff0c;接下来应…

C#,入门教程(31)——预处理指令的基础知识与使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(30)——扎好程序的笼子&#xff0c;错误处理 try catchhttps://blog.csdn.net/beijinghorn/article/details/124182386 Visual Studio、C#编译器以及C#语法所支持的预处理指令&#xff0c;绝对是天才设计。 编译程序的时候会发现&am…

【技术】SpringBoot 接口怎么加密解密

1. 介绍 在我们日常的Java开发中&#xff0c;免不了和其他系统的业务交互&#xff0c;或者微服务之间的接口调用 如果我们想保证数据传输的安全&#xff0c;对接口出参加密&#xff0c;入参解密。 但是不想写重复代码&#xff0c;我们可以提供一个通用starter&#xff0c;提…

代码随想录算法训练营第14天 | 二叉树的前序、中序、后序遍历(递归+迭代法)

二叉树的理论基础&#xff1a;&#xff08;二叉树的种类&#xff0c;存储方式&#xff0c;遍历方式 以及二叉树的定义&#xff09; https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 二叉树的递归遍历 Leetcode对应的三道习…

这种环境下腾讯64亿在北京拿地?

近期&#xff0c;金融市场出现较大波动&#xff0c;A股指数跌至2700点&#xff0c;同时恒生指数也下滑至15000点&#xff0c;引发了社会各界的关注和思考。与此同时&#xff0c;腾讯以64.2亿元拿下北京海淀区地块&#xff0c;马云和蔡崇信又增持阿里股票&#xff0c;这一系列的…

自学网安-DNS

01DNS Domain Name Service域名服务 作用&#xff1a;为客户机提供域名解析服务器 02域名组成 2.1域名组成概述 如"www.sina.com.cn"是一个域名&#xff0c;从严格意义上讲&#xff0c;"sina.com.cn"才被称为域名(全球唯一)&#xff0c;而"www"…

【若依】前后端分离框架部署

1.拉取若依项目代码 进入若依 基于SpringBootVue前后端分离的Java快速开发框架&#xff0c;并通过相应协议拉取到本地IDE 2.前端部署 2.1.下载nodejs 进入nodejs官网下载所需版本&#xff0c; 完成后在命令行运行npm -v可查询版本 2.2.配置依赖 在若依ui目录下运行 np…

Linux第33步_TF-A移植的第1步_创建新的设备树

TF-A移植第1步就是创建新的设备树&#xff0c;并命名为“stm32mp157d-atk”。 和“TF-A移植”有关的知识点&#xff1a; 1)设备树英文名字叫做Device tree&#xff0c;用来描述板子硬件信息的&#xff0c;比如开发板上的 CPU有几个核 、每个CPU核主频是多少&#xff0c;IIC、…

web安全学习笔记【10】——数据包分析

基础[1] [2] [3] [4] 入门-HTTP数据包&Postman构造&请求方法&请求头修改&状态码判断[5] [6] [7] #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OS…