Java算法---递归算法基础介绍

目录

一、递归算法

二、递归算法的典型例子

(1)阶乘

(2)二分查找

 (3)冒泡排序

(4)插入排序



一、递归算法

计算机科学中,递归是一种解决计算问题的方法。其中解决方案取决于同一类问题的更小子集。说明如下。
(1)自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)
(2)每次调用,函数处理的数据会较上次缩减(子集),而且最后会缩减至无须继续递归。
(3)内层函数调用(子集处理)完成,外层函数才能算调用完成

二、递归算法的典型例子

(1)阶乘

 求解1到n的阶乘(也就是1*2*3*4*......*n)

public static void main(String[] args) {
       System.out.println(f(5));
    }
    public static int f(int n){
        if(n==1){
            return 1;
        }
        return n*f(n-1);
    }

(2)二分查找

关于二分查找算法的概念,我就不具体介绍了,可以看看博主写的文章:二分查找

 public static int f(int[] a,int target,int i,int j){
        //target是查找的目标值,i是左边界,j是有边界,函数返回值查找的目标值的位置
        if(i>j){
            return -1;
        }
        int m=(i+j)>>>1;
        if(target<a[m]){
            return f(a,target,0,m-1);
        }
        else if(target>a[m]){
            return f(a,target,m+1,j);
        }
        else{
            return m;
        }
   }
}

 (3)冒泡排序

冒泡排序(这里排序我是按照升序)的大概思想是:

  1. 比较相邻元素: 从数组的第一个元素开始,依次比较相邻的两个元素。

  2. 交换元素位置: 如果发现顺序不对(比如前面的元素大于后面的元素),则交换这两个元素的位置。

  3. 一轮完成: 经过一轮的比较和交换,最大(或最小)的元素就像“冒泡”一样浮到数组的一端(比如末尾)。

  4. 重复步骤: 重复以上步骤,直到整个数组排序完成。每一轮都会使一个元素移动到其最终的位置。

这个过程类似于水中的气泡逐渐向上升,所以得名“冒泡排序”。

public static void f(int[] a,int j){
        /*
        * 这里的大概思想是升序的,以j为分界线,j左边是还没有排序的,
        * j右边的表示以及排序过,
        * */
        if(j==0){
            return;
        }
        for(int i=0;i<j;i++){
            if(a[i]>a[i+1]){
                int f=a[i];
                a[i]=a[i+1];
                a[i+1]=f;
            }
        }
        f(a,j-1);
   }

(4)插入排序

插入排序的大概思想是:

插入排序是一种简单直观的排序算法,其基本思想是将待排序的数据分成已排序和未排序两部分,然后每次从未排序部分取出一个元素,在已排序部分找到合适的位置将其插入,使得已排序部分仍然保持有序。该过程不断重复,直到所有元素都被排序完毕。

具体的插入排序算法步骤如下:

  1. 初始化: 将第一个元素视为已排序部分,其余的元素视为未排序部分。

  2. 遍历: 从未排序部分取出一个元素,将其与已排序部分的元素逐一比较,找到合适的位置插入。

  3. 插入: 将选中的元素插入到已排序部分的正确位置,同时调整已排序部分的顺序。

  4. 重复: 重复步骤2和步骤3,直到未排序部分为空,所有元素都已插入到已排序部分。

插入排序是一种稳定的排序算法,适用于小规模数据或部分有序的数据集。其时间复杂度为O(n^2),其中n是待排序元素的数量。在实际应用中,插入排序对于已经基本有序的数据集,效率较高,因为大部分元素在插入过程中只需进行少量的比较和移动。

public static void charu(int[] a,int j){
       if(j==a.length-1){
           return;
       }
        //j就是已经排序好的最后一个位置
       int tmp=a[j+1];
       int i;
       for(i=j;i>=0;i--){
          if(a[i]>tmp){
              a[i+1]=a[i];
          }
          else{
              break;
          }
      }
      a[i+1]=tmp;

       charu(a,j+1);
   }

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yum指令——Linux的软件包管理器

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 什么是软件包yum指令1.yum 是什么&#xff1f;2.Linux系统&#xff08;Centos&#xff09;的生态 3.yum的相关操作安装卸载yum的相关操作小结 软件源安…

Python判断语句——布尔类型和比较运算符

一、引言 在Python编程语言中&#xff0c;布尔类型和比较运算符是基础而又至关重要的概念。它们是构建逻辑和决策的核心要素&#xff0c;让程序能够理解“真”与“假”、以及各种数量和值之间的关系。理解并掌握这些概念&#xff0c;对于编写高效、准确的代码至关重要。在本文…

OpenHarmony—仅允许在表达式中使用typeof运算符

规则&#xff1a;arkts-no-type-query 级别&#xff1a;错误 ArkTS仅支持在表达式中使用typeof运算符&#xff0c;不允许使用typeof作为类型。 TypeScript let n1 42; let s1 foo; console.log(typeof n1); // number console.log(typeof s1); // string let n2: typeof …

【极数系列】Flink集成DataSource读取集合数据(07)

文章目录 01 引言02 简介概述03 基于集合读取数据3.1 集合创建数据流3.2 迭代器创建数据流3.3 给定对象创建数据流3.4 迭代并行器创建数据流3.5 基于时间间隔创建数据流3.6 自定义数据流 04 源码实战demo4.1 pom.xml依赖4.2 创建集合数据流作业4.3 运行结果日志 01 引言 源码地…

基于Python 爬虫的房地产数据可视化分析与实现

摘要&#xff1a; 过去&#xff0c;不管是翻阅书籍&#xff0c;还是通过手机&#xff0c;电脑等从互联网上手动点击搜索信息&#xff0c;视野受限&#xff0c;信息面太过于狭窄&#xff0c;且数据量大而杂乱&#xff0c;爆炸式信息的更新速度是快速且不定时的。要想手动获取到海…

OpenAI、斯坦福大学提出Meta-Prompting,有效提升语言模型的性能

为了研究如何提高语言模型的性能&#xff0c;使其更充分有效地输出对于提问的回答&#xff0c;来自斯坦福和 OpenAI 的学者强强联手&#xff0c;通过提出一种名为元提示&#xff08;meta-prompting&#xff09;的方法来深入探索。元提示通过让单个语言模型&#xff08;如 GPT-4…

【JavaScript基础入门】04 JavaScript基础语法(二)

JavaScript基础语法&#xff08;二&#xff09; 目录 JavaScript基础语法&#xff08;二&#xff09;变量变量是什么声明变量变量类型动态类型注释 数字与运算符数字类型算术运算符操作运算符比较运算符逻辑运算符运算符的优先级 变量 变量是什么 在计算机中&#xff0c;数据…

练习12.6_横向射击_Python编程:从入门到实践(第3版)

编写一个游戏&#xff0c;将一艘飞船放在屏幕左侧&#xff0c;并允许玩家上下移动飞船。在玩家按空格键时&#xff0c; 让飞船发射一颗在屏幕中向右飞行的子弹&#xff0c;并在子弹从屏幕中消失后将其删除。 ship_shooting.py import pygame import sys from leftship impor…

RabbitMQ基础编程模型及详细使用

目录 RabbitMQ基础编程模型 引入依赖 创建连接&#xff0c;获取Channel 声明Exchange-可选 声明queue 声明Exchange与Queue的绑定关系-可选 Producer根据应用场景发送消息到queue Consumer消费消息 Consumer主要有两种消费方式 1、被动消费模式 2、主动消费模式 完成…

sqli-labs闯关

目录 1.安装靶场2.了解几个sql常用知识2.1联合查询union用法2.2MySQL中的通配符&#xff1a;2.3常用函数2.4数据分组 3.mysql中重要的数据库和表4.开始闯关4.1 Less-14.1.1 首先进行一次常规的注入4.1.2 深入解析 1.安装靶场 1.首先推荐使用github下载靶场源码 https://githu…

内网安全:PTH PTK PTT

目录 实验所用网络拓朴图 网络环境说明​​​​​​​ LM认证 NTLM认证 NTLM Hash Kerberos认证 TGT票据 服务票据 Windows系统密码存储 域控制器 - 用户登录 域用户 本地用户 域用户和本地管理员 用户登录 Mimikatz抓取密码来源 域内一台主机上可以得到非本地用…

js实现贪吃蛇

文章目录 实现方法_11实现效果2 实现步骤2.1 移动场地2.2 游戏难度2.3 造蛇和食物2.4 蛇的移动2.5 产生食物的随机位置 3 全部代码 实现方法_21 实现效果2实现想法2.1 蛇的存储 实现方法_1 1实现效果 2 实现步骤 html部分忽略&#xff0c;布局写的太辣眼了 2.1 移动场地 用的表…

遥感的CCDC连续变化监测的qgis插件

简介 今天我逛GitHub的时候&#xff0c;看到一个比较有意思的插件:CCD-Plugin&#xff0c;记录一下。 CCD-Plugin是一个qgis插件&#xff0c;它使用 Google Earth Engine 获取 Landsat 或 Sentinel2 数据集&#xff0c;并运行连续变化检测 (CCDC) 算法来分析给定点的多年时间序…

【C++】一题掌握空指针

今天看见一道面试题&#xff0c;比较有意思&#xff0c;这一分享出来&#xff1a; 1.下面程序能编译通过吗&#xff1f; 2.下面程序会崩溃吗&#xff1f;在哪里崩溃 class A {public:void PrintA(){cout<<_a<<endl;}void Show(){cout<<"Show()"&…

(自用)learnOpenGL学习总结-高级OpenGL-模板测试

模板测试 模板测试简单来说就是一个mask&#xff0c;根据你的mask来保留或者丢弃片段。 那么可以用来显示什么功能呢&#xff1f;剪切&#xff0c;镂空、透明度等操作。 和深度缓冲的关系是&#xff1a; 先片段着色器&#xff0c;然后进入深度测试&#xff0c;最后加入模板测…

Linux第37步_解决“Boot interface 6 not supported”之问题

在使用USB OTG将“自己移植的固件”烧写到eMMC中时&#xff0c;串口会输出“Boot interface 6 not supported”&#xff0c;发现很多人踩坑&#xff0c;我也一样。 见下图&#xff1a; 解决办法&#xff1a; 1、打开终端 输入“ls回车”&#xff0c;列出当前目录下所有的文件…

Centos7 升级Docker 至最新版本

卸载旧版本的Docker yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装需要的软件包 yum install -y yum-utils device-mapper-persistent-data lvm2 添加Docker的yum源 #yu…

防范[myers@airmail.cc].mkp攻击:解密[myers@airmail.cc].mkp勒索病毒的方法

引言&#xff1a; 随着科技的迅猛发展&#xff0c;网络安全问题日益突出&#xff0c;而勒索病毒也成为当前互联网威胁中的一大焦点。其中&#xff0c;[datastorecyberfear.com].mkp [hendersoncock.li].mkp [hudsonLcock.li].mkp[myersairmail.cc].mkp勒索病毒以其强大的加密能…

QT学习日记 | 初始QT

目录 一、创建QT文件 二、目录结构讲解 1、.pro文件 2、源文件与头文件 3、编译运行 4、界面文件 三、梦开始的地方&#xff08;Hello World&#xff01;&#xff09; 1、代码方式 2、拖拽方式 四、Qt中的“容器” 五、Qt的对象树机制 1、对象树的引入 2、对象树…

Java 的文件类的学习总结

目录 一、File 的创建 二、File 类的常用方法 一、File 的创建 二、File 类的常用方法