递归~~~

news2024/11/15 12:51:28

一.定义

计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集。

比如单链表递归遍历的例子:

     void f(Node node){
         if (node == null){
             return;
         }
         f(node.next);
     }

说明:

1.自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)

2.每次调用,函数处理的数据会比较上次缩减(子集),而且最后会缩减至无需继续递归

3.内层函数调用(子集处理)完成,外层函数才能算调用完成

二:思路

1.确定能否使用递归求解

2.推导出递推关系,即父问题与子问题的关系,以及递归的结束条件

:深入到最里层叫做,从最里层出来叫做,在的过程中,外层函数内的局部变量(以及方法参数)并未消失,归的时候还可以用到。

三:例题

1.求阶乘

    private static int f(int n){
        if (n == 1){
            return 1;
        }
        return n*f(n-1);
    }
2.反向打印字符

    private static void f(int n,String str){
        if (n == str.length()){
            return;
        }
        f(n+1,str);
        System.out.println(str.charAt(n));
    }
3.二分查找
   public int f(int[]a,int target,int i,int j){
       if (i>j){
           return -1;
       }
       
       int m = (i+j)>>>1;
       if (target < a[m]){
           return f(a,target,i,m-1);
       } else if (a[m] < target) {
           return f(a,target,m+1,j);
       }else {
           return m;
       }
   }
4.冒泡排序
 //j代表未排序区域右边界
 private void bubble(int[] a,int j){
       if (j == 0){
           return;
       }
       for (int i = 0;i < j;i++){
           if (a[i] > a[i+1]){
               int t = a[i];
               a[i] = a[i+1];
               a[i+1] = t;
           }
       }
       bubble(a,j-1);
   }

优化版:当某一次递归后所有值已经有序,就不需要再进行接下来的代码了

 //j代表未排序区域右边界
 //x是i在交换前i对应的位置,若未发生交换,则x不变,则x右边值都是有序的
 private void bubble(int[] a,int j){
       if (j == 0){
           return;
       }
       int x = 0;
       for (int i = 0;i < j;i++){
           if (a[i] > a[i+1]){
               int t = a[i];
               a[i] = a[i+1];
               a[i+1] = t;
               x = i;
           }
       }
       bubble(a,x);
   }
5.插入排序

   //low为未排序区域的左边界
   private void insertion(int[] a,int low){
        if (low == a.length){
            return;
        }
       int t = a[low];//low位置的值
       int i = low-1; //已排序区域指针

       while(i >= 0 && a[i] > t){  //寻找小于t的第一个位置,没有找到插入位置
           a[i+1]=a[i];   //空出插入位置,即将a[i]值赋予low,直到找到插入位置
           i--;
       }
       //找到插入位置
       if (i+1 != low){   //例如2 3 4 要插入4时,已经是有序的,不需要再赋值了
           a[i+1]=t;
       }
       insertion(a,low+1);
   }
6.斐波那契数列
(1)代码实现

   public int f(int n){
       if (n == 0){
           return 0;
       }
       if (n == 1){
           return 1;
       }
       int x = f(n-1);
       int y = f(n-2);
       return x+y;
   }

(2)变体一:兔子问题

(3)变体二:青蛙爬楼梯

(4)优化版:记忆法
   public int fibonaci(int n){
      int[] cache = new int[n+1];//若n=5,则f(5)需存入cache[5],从0开始需要6个长度
       Arrays.fill(cache,-1);//[-1,-1,-1,-1,-1,-1]
       cache[0] = 0;
       cache[1] = 1;//[0,1,-1,-1,-1,-1]
       return f(n,cache);
   }
    public int f(int n,int[] cache){
        if (cache[n] != -1){  //先在数组里找值
            return cache[n];  //找到直接返回
        }
        int x = f(n-1,cache);
        int y = f(n-2,cache);
        cache[n] = x + y;//[0,1,?,-1,-1,-1]存入数组
        return cache[n];
    }

7.杨辉三角
    //算出数字
    private static int element(int i,int j){
       if (j == 0 || i == j){
           return 1;
       }
       return element(i-1,j-1)+element(i-1,j);
    }
    //打印空格
    private static void printSpace(int n,int i){
       int num = (n-1-i)*2;
       for (int j=0;j<num;j++){
           System.out.print(" ");
       }
    }
    //打印数字
    public static void print(int n){
       for (int i=0;i<n;i++){
           printSpace(n,i);
           for (int j=0;j<=i;j++){
               System.out.printf("%4d",element(i,j));
           }
           System.out.println();
       }
    }

8.杨辉三角优化:记忆法

提前把值存入数组,就不需要重复计算

    //算出数字
    private static int element(int[][] triangle,int i,int j){
       if (triangle[i][j]>0){//先看数组里是否存在,开始时每个数都是0,若是有值则大于0
           return triangle[i][j];
       }
       if (j == 0 || i == j){
           triangle[i][j]=1;
           return 1;
       }
       triangle[i][j] = element(triangle,i-1,j-1)+element(triangle,i-1,j);
       return triangle[i][j];//将值存入数组
    }
    //打印空格
    private static void printSpace(int n,int i){
       int num = (n-1-i)*2;
       for (int j=0;j<num;j++){
           System.out.print(" ");
       }
    }
    //打印数字
    public static void print(int n){
       int[][] triangle = new int[n][];//每行有多少列不确定
       for (int i=0;i<n;i++){ //行
           triangle[i] = new int[i+1];//确定列,根据规律可得j=i+1,从第0行开始算
           printSpace(n,i);
           for (int j=0;j<=i;j++){
               System.out.printf("%4d",element(triangle,i,j));
           }
           System.out.println();
       }
    }

四:递归时间复杂度计算

1.公式法

2.展开求解

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

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

相关文章

基于SpringBoot+Vue的汽车服务管理系统(带1w+文档)

基于SpringBootVue的汽车服务管理系统(带1w文档) 基于SpringBootVue的汽车服务管理系统(带1w文档) 在开发系统过程中采用Java语言、MySQL数据库存储数据。系统以B/S为基础&#xff0c;实现管理一体化、规范化&#xff0c;为用户提供一个高效快捷的交流系统[5]。利用springboot架…

LearnOpenGL之3D显示

前序 AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合&#xff1a; Github地址&#xff1a;https://github.com/wangyongyao1989/AndroidLearnOpenGL 系列文章&#xff1a; 1、LearnOpenGL之入门基础 2、LearnOpenGL之3D显示 显示效果 根据上一篇文章的LearnO…

结构型设计模式:桥接/组合/装饰/外观/享元

结构型设计模式&#xff1a;适配器/代理 (qq.com)

浮动IP(Floating IP)计费;OpenStack算力共享;OpenStack实现资源虚拟化;算力调度策略

目录 浮动IP(Floating IP)计费 浮动IP的定义与作用 计费中的浮动IP数据 浮动IP在计费中的作用 OpenStack算力共享 一、OpenStack在算力共享中的角色 二、OpenStack与算力共享的结合方式 三、实际应用案例 算力调度策略 算力计费策略 OpenStack实现资源虚拟化 1.虚…

用于仅摄像头闭环驾驶的视觉语言模型

CarLLaVA: Vision language models for camera-only closed-loop driving 用于仅摄像头闭环驾驶的视觉语言模型 Abstract In this technical report, we present CarLLaVA, a Vision Language Model (VLM) for autonomous driving, developed for the CARLA Autonomous Driv…

【云原生】kubernetes最新版本1.30.2,集群搭建部署全方位攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

SimGCL graph contrastive learning by finding homophily in heterophily

发表于: Knowledge and Information Systems, ccfb 推荐指数: #paper/ ⭐ 总结: 重新定义了相似度矩阵, 重新定义了特征, 重新设计了节点删除概率等, 但是, 换汤不换药, 引入了大量的超参 (快 10 个了吧). 创新点不够, 所以 ccf B 期刊理所应该. (甚至我觉得更低) 相关知识: 本…

详细教程 MySQL 数据库 下载 安装 连接 环境配置 全面

数据库就是储存和管理数据的仓库&#xff0c;对数据进行增删改查操作&#xff0c;其本质是一个软件。 首先数据有两种&#xff0c;一种是关系型数据库&#xff0c;另一种是非关系型数据库。 关系型数据库是以表的形式来存储数据&#xff0c;表和表之间可以有很多复杂的关系&a…

通俗易懂玩Qt:时间滑动选择器实现(内附主要源码)

时间滑动选择器实现 组件说明&#xff1a; 本组件命名为时间滑动选择器&#xff0c;主要运用于 arm 平台下的触摸屏上&#xff0c;虽然 QT 自带有时间选择组件&#xff0c;但是对触摸屏的使用并不友好&#xff0c;为了提升项目界面的交互性&#xff0c;于是就有了时间滑动选择器…

【深海王国】初中生也能画的电路板?番外1:Arduino其他家族成员的拓展板开发(1)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛苦工作的你今天也辛苦啦(/≧ω) 今天大都督为大家带来电路板的番外系列——初中生也能画的电路板&#xff1f;番外1&#xff1a;Arduino其他家族成员的拓展板开发&#xff0c;带你给其他Arduino家族成…

数据库漫游记:表、视图、函数、存储过程及触发器之跨平台兼容性分析(上)

先言之 &#x1f31f;余撰此文&#xff0c;乃为导引初窥数据库之学人&#xff0c;俾其明了表、视图、函数、存储过程及触发器之义理&#xff0c;及其于诸般平台之上创建、修改与废弃之法式。盖初学之人&#xff0c;常陷于迷雾之中&#xff0c;难辨东西&#xff0c;故须详述而明…

lombok使用@slf4j 运行时提示找不到符号log(Missing POM for org.projectors:lombok:jar)

1.问题表现 原本是之前搭建好的工程&#xff0c;只是换了个开发环境重新启动就不行了。一直编译不通过&#xff01; 可以看到IDEA其实是引入了依赖的 都没有出现红色波浪线 <mapstruct.version>1.5.5.Final</mapstruct.version> <lombok.version>1.18.30<…

鸿蒙(API 12 Beta2版)NDK开发【JSVM-API使用规范】

JSVM-API使用规范 生命周期管理 【规则】 合理使用OH_JSVM_OpenHandleScope和OH_JSVM_CloseHandleScope管理JSVM_Value的生命周期&#xff0c;做到生命周期最小化&#xff0c;避免发生内存泄漏问题。 每个JSVM_Value属于特定的HandleScope&#xff0c;HandleScope通过OH_JSV…

【Python实战因果推断】71_图因果模型6

目录 Positivity Assumption An Identification Example with Data Confounding Bias Positivity Assumption 调整公式同样强调了正则性&#xff08;positivity&#xff09;的重要性。因为你正在对治疗和结果之间的差异在X的条件下求平均&#xff0c;你必须确保对于所有X的…

【32单片机篇】项目:WIFI天气预报

一、项目需求 使用 ESP8266 通过 HTTP 获取天气数据&#xff08;心知天气&#xff09;&#xff0c;并显示在 OLED 屏幕上。 按键 1 &#xff1a;循环切换今天/明天/后天天气数据&#xff1b; 按键 2 &#xff1a;更新天气 二、项目框图 三、硬件部分 四、项目源码及实现 1.项…

MySQL是怎样运行的——第1章 初识MySQL

文章目录 1. 1 MySQL的客户端/服务器架构1.2 安装MySQL&#xff08;略&#xff09;1.3 启动MySQL服务器程序1.4 启动MySQL客户端程序1.5 客户端与服务器连接的过程1.6 服务器处理客户端请求 1. 1 MySQL的客户端/服务器架构 MySQL的运行过程就是C/S架构。多个客户端程序连接到服…

洛谷 P1868 饥饿的奶牛

原题 题目描述 有一条奶牛冲出了围栏&#xff0c;来到了一处圣地&#xff08;对于奶牛来说&#xff09;&#xff0c;上面用牛语写着一段文字。 现用汉语翻译为&#xff1a; 有 N 个区间&#xff0c;每个区间x,y 表示提供的x∼y 共y−x1 堆优质牧草。你可以选择任意区间但不…

dockerfile定制镜像 docker-compose编排容器

1 dockerfile dockerfile本质上是利用了Linux系统的挂载&#xff08;UnionFS&#xff09;&#xff0c;将多个目录挂载到同一目录下&#xff0c;实现镜像的层叠式结构&#xff0c;从而实现功能聚合。 1.1 一个最简单的程序 package mainimport "fmt"func main() {f…

【leetcode详解】覆盖所有点的最少矩形数目(C++思路详解)

思路详解&#xff1a; 0. 题目情境并未限制矩形高度&#xff0c;故矩形数目的判断只和点的横坐标有关 1. 为了不重不漏地考虑到所有点&#xff0c;故笔者选择首先将二维数组中的点按横坐标的大小排序 //说明&#xff1a;本来笔者以为需要自定义sort排序&#xff0c;后来发现…

智慧水务项目(三)django(drf)+angular 18 创建系统管理的用户、角色、部门、权限管理等model

一、说明 添加各model 添加requirement.txt中的库 添加env.py中的动态配置 二、env.py全文 import os from smartwater.settings import BASE_DIR# # # ************** mysql数据库 配置 ************** # # # # 数据库地址 DATABASE_ENGINE "django.db.backends.…