递归算法常见问题(Java)

news2024/12/27 10:21:52

问题:斐波那契数列,第1项和第2项都为1,后面每一项都为相邻的前俩项的和,求第n个数

解法:每一个数都为前俩个数之和,第1项和第2项都为1,所以写 方法f1(n)即为求第n个数,那么f1(n-1)为求第n-1个数,f(n-2)为第n-2个数。所以f1(n)=f1(n-1)+f1(n-2),然后设置出口,n=1或者n=2时返回1。

public class Test2 {
    public static void main(String[] args) {
        System.out.println(f1(6));
    }
    //斐波那契数列,第1项和第2项都为1,后面每一项都为相邻的前俩项的和,求第n个数
    //f1为求第n个数,第n个数为第n-1个数加上第n-2个数
    static int f1(int n){
        if(n==1||n==2)
            return 1;
        return f1(n-1)+f1(n-2);
    }
}

问题:求m和n的最大公约数,m>n

解法:若m%n=0,则n即最大公约数,若为k,则m与n的最大公约数可转换为 n与k的最大公约数

public class Test2 {
    public static void main(String[] args) {
       System.out.println(f2(36, 24));
    }
    //斐波那契数列,第1项和第2项都为1,后面每一项都为相邻的前俩项的和,求第n个数
    //f1为求第n个数,第n个数为第n-1个数加上第n-2个数
    static int f2(int m,int n){
        if(m%n==0)
            return n;
        return f2(n,m%n);
    }
}

问题:对无序数组arr进行排序,arr数组大小为k

解法:对无序数组arr排序 等价于 对前k-1个元素排序后,在对第k个元素插入排序。先进行第1个元素和第2个元素的排序,然后对第3个元素插入排序,然后对第4个元素插入排序....不断递归。

public class Test2 {
    public static void main(String[] args) {
       int[] arr= new int[]{9,9,7,6,5,4,3,2,1};
        f3(arr,arr.length-1);
        for (int i : arr) {
            System.out.println(i);
        }
    }

    static void f3(int[] arr,int k){
        if(k==0)
            return;
        //对前k-1个元素进行排序
        f3(arr,k-1);
        //把位置k的元素插到前面
        int x=arr[k];
        int index=k-1;
        while(index>=0 && x<arr[index]){
            arr[index+1]=arr[index];
            index--;
        }
        arr[index+1]=x;
    }
}

问题:汉诺塔

将1~N从a移动到c,b作为辅助
等价于:将1~N-1从a移动到b,将N移动到c,这时a为空,c为空(此时c有N但因为N不用动了,所以看作为空),然后在把1~N-1移动到c,a为辅助。

public class Test2 {
    public static void main(String[] args) {
       f4(3,"A","C","B");
    }

    //N个小盘子,from初始柱子,to目标柱子,help辅助柱子
    static void f4(int n,String from,String to,String help){
        if(n==1){
            System.out.println("move"+n+"from"+from+"to"+to);
        }else {
            f4(n-1,from,help,to); //把前n-1个盘子移到辅助柱子上
            System.out.println("move"+n+"from"+from+"to"+to);//n号盘子可以到达目标柱子
            f4(n-1,help,to,from); //n-1个盘子回到目标柱子
        }
    }
}

问题:上楼梯、一共n阶,一次性可以上1阶、2阶或3阶,问多少种走楼梯的方法

 上第n阶时,有三种情况,它可以从第n-1阶上1阶、从第n-2阶上2阶、从第n-3阶上3阶。

所有f(n)=f(n-1)+f(n-2)+f(n-3)。

public class Test2 {
    public static void main(String[] args) {
       System.out.println(f1(8));
    }

    static int f1(int n){
        if(n==1)return 1;
        if(n==2)return 2;
        if(n==3)return 4;
        return f1(n-3)+f1(n-2)+f1(n-1);
    }
}

问题:旋转数组,把一个递增数组的前若干个序列搬到该数组的最后,比如{1,2,3,4,5}->{3,4,5,1,2},求该数组的最小值

解法:最小值一定在无序的那一半中。

public class Test2 {
    public static void main(String[] args) {
       
    }

    //最小值一定在无序的那一半中。
    static int f2(int[] arr){
        int begin=0,end=arr.length-1;
        //考虑没有旋转这种特殊旋转
        if(arr[begin]<arr[end])return arr[begin];
        while(begin+1<end){
            int mid=begin+((end-begin)>>1);
            if(arr[mid]>arr[begin]){ //左侧为有序
                begin=mid;
            }else{ //右侧有序
                end=mid;
            }
        }
        return arr[end];
    }
}

问题:在给定一个无序的数组中,找出最长连续递增的子序列

解法:找到第一个递增子序列的长度,然后递归下一个递增子序列的长度,直到遍历完数组

public class Test2 {
    public static void main(String[] args) {
        int[] arr = new int[]{1,9,4,5,6,7,8,9,3,6,7};
        int[]ans=f4(arr,0);
        for(int i=0;i<ans.length;i++){
            System.out.println(ans[i]);
        }
    }

    static int[] f4(int[] arr,int start){
        if(start>=arr.length)return new int[]{};
        int count=1,index=start;
        while(index<arr.length-1 &&arr[index+1]>arr[index]){
            index++;
            count++;
        }
        int[] ans= new int[count];
        for(int i=start;i<start+count;i++){
            ans[i-start]=arr[i];
        }
        int[] a=f4(arr,start+count);
        return count>a.length?ans:a;
    }
}

问题:设计一个高效的求a的n次幂的算法

public class Test2 {
    public static void main(String[] args) {
        int n = -3
        int ans=f5(2,Math.abs(n));
        System.out.println(n>=0?ans:("1/"+ans));
    }

    static int f5(int a,int n){
        if(n==0)return 1;
        int ans=a;
        int ex=1;//指数
        while((ex<<1)<=n){
            ans*=ans;
            ex<<=1;
        }
        //差n-ex次方
        ans*=f5(a,n-ex);
        return ans;
    }
}

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

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

相关文章

SpringBoot + HttpSession 自定义生成sessionId

SpringBoot HttpSession 自定义生成sessionId 业务场景实现方案 业务场景 最近在做用户登录过程中&#xff0c;由于默认ID是通过UUID创建的&#xff0c;缺乏足够的安全性&#xff0c;决定要自定义生成 sessionId。 实现方案 正常的获取session方法如下&#xff1a; HttpSe…

【流量、洪水数据下载】网站介绍和下载经验....不断更新!

EarthData 介绍 NASA:链接 数据下载 视频教程:Discover and Access Earth Science Data Using Earthdata Search 数据下载需要注册,已经被卡在邮箱验证上【2024-12-26】… Essential Climate Variables——【The Global Climate Observing System(GCOS) 介绍 其是支…

Pytorch | 利用SMI-FGRM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用I-FGSSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集SMI-FGRM介绍SMI-FGRM算法流程 SMI-FGRM代码实现SMI-FGRM算法实现攻击效果 代码汇总smifgrm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CI…

少儿编程在线培训系统:客户服务与学习支持

2.1 VUE技术 VUE它是由HTML代码&#xff0c;配上嵌入在HTML代码里面的Java代码组成的应用于服务器端的语言&#xff0c;使用VUE进行开发能够更加容易区分网页逻辑以及网页设计内容&#xff0c;让程序员开发思路更加清晰化&#xff0c;VUE在设计组件时&#xff0c;它是可以重用的…

流批一体向量化计算引擎 Flex 在蚂蚁的探索和实践

编者按&#xff1a;Flex是蚂蚁数据部自研的一款流批一体的向量化引擎&#xff0c;Flex是Fink和Velox的全称&#xff0c;也是Flexible的前缀&#xff0c;被赋予了灵活可插拔的寓意。本文将重点从向量化技术背景、Flex架构方案和未来规划三个方面展开论述。 作者介绍&#xff1a;…

upload-labs关卡记录11

先上传一个一句话木马试试&#xff0c;居然可以上传成功&#xff0c;复制图片链接&#xff0c;在另一个窗口打开&#xff1a; 会发现&#xff0c;我们明明上传的是shell.php&#xff0c;但是这里就是没有了php,这样我们在执行我们相关的语句的时候就无法执行了&#xff1a; 就…

WebRTC服务质量(08)- 重传机制(05) RTX机制

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

借助 obdiag,让 OceanBase 参数和变量的对比更简单

本文将介绍 obdiag 工具中参数对比和变量对比功能的适用场景和试用方法。​​​​​​​ obdiag 参数和变量对比功能的适用场景 参数对比功能适用场景 不同observer对于同一参数允许配置不同的值&#xff0c;实际生产环境中&#xff0c;用户可能因多种原因在不同observer上为同…

Net9解决Spire.Pdf替换文字后,文件格式乱掉解决方法

官方文档 https://www.e-iceblue.com/Tutorials/Spire.PDF/Program-Guide/Text/Find-and-replace-text-on-PDF-document-in-C.html C# 在 PDF 中查找替换文本 原文件如下图&#xff0c;替换第一行的新编码&#xff0c;把41230441044替换为41230441000 替换代码如下&#xff…

VBA技术资料MF246:将工作表中形状复制到WORD文档

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

一次医院RIS系统的升级

2020-03-11 目录 数据库升级... 1 数据结构升级... 1 系统配置... 2 WEB服务器准备... 3 启动ASP.NET State Service服务... 3 检查IIS. 4 发布站点... 4 添加应用程序池... 4 发布网站... 5 处理打印模板... 6 web.config的配置... 6 处理图片文件目录... 6 修改W…

显示 Windows 任务栏

显示 Windows 任务栏 1. 取消勾选自动隐藏任务栏2. 重启 Windows 资源管理器References 1. 取消勾选自动隐藏任务栏 Windows 任务栏具有自动隐藏功能&#xff0c;不使用时自动隐藏&#xff0c;使用时显示。 鼠标右键单击桌面上的空白区域&#xff0c;个性化 -> 任务栏。不…

【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体

版本&#xff1a;Unity2019.4.0f1 PackageManager下载Burst插件(1.2.3版本) 利用如下代码&#xff0c;生成一个Texture3D资源&#xff0c;它只能脚本生成&#xff0c;是一个32*32*32的立方体&#xff0c;导出路径记得改下&#xff0c;不然报错。 using UnityEditor; using Uni…

轻量级安全云存储方案Hoodik

什么是 Hoodik &#xff1f; Hoodik 是一款轻量级、安全且自托管的云存储解决方案。它采用 Rust 和 Vue 设计和构建&#xff0c;专注于端到端加密&#xff0c;保护您的数据免受窥探和黑客的侵害。Hoodik 支持文件上传和下载&#xff0c;让您可以轻松地与其他用户共享文件。简单…

[WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同

[WASAPI] 从Qt MultipleMedia 来看WASAPI 最近在学习有关Windows上的音频驱动相关的知识&#xff0c;在正式开始说WASAPI之前&#xff0c;我想先说一说Qt的Multiple Media&#xff0c;为什么呢&#xff1f;因为Qt的MultipleMedia实际上是WASAPI的一层封装&#xff0c;它在是线…

Linux 大文件管理与 Hugging Face 模型下载实践:解决磁盘空间与大文件传输的全攻略20241226

Linux 大文件管理与 Hugging Face 模型下载实践&#xff1a;解决磁盘空间与大文件传输的全攻略 引言 在 Linux 系统中管理大文件是一项常见但不容忽视的任务&#xff0c;尤其是在处理复杂场景时&#xff0c;比如磁盘空间不足、断点续传下载模型文件、管理日志文件等。通过实际…

TOGAF之架构标准规范-业务架构

TOGAF标准规范中&#xff0c;业务架构阶段的主要工作是开发支持架构愿景的业务架构。 如上所示&#xff0c;业务架构&#xff08;Business Architecture&#xff09;在TOGAF标准规范中处于B阶段&#xff0c;该阶段的主要内容包括阶段目标、阶段输入、流程步骤、架构方法。 阶段…

aPaaS是什么?有何特点?以及aPaaS核心优势有哪些?

​aPaaS是什么&#xff1f; aPaaS&#xff0c;Application Platform as aService&#xff0c;应用程序平台即服务。国际知名咨询机构 Gartner 对aPaaS所下的定义是&#xff1a;“这是基于PaaS(平台即服务)的一种解决方案&#xff0c;支持应用程序在云端的开发、部署和运行&…

【网络分析工具】WireShark的使用(超详细)

网络分析工具——WireShark的使用 简介WireShark软件安装Wireshark 开始抓包示例WireShark抓包界面WireShark 主要分为这几个界面TCP包的具体内容Wireshark过滤器设置wireshark过滤器表达式的规则Wireshark抓包分析TCP三次握手Wireshark分析常用操作 简介 WireShark是非常流…

前端js验证码插件

相关代码,在最上方的绑定资源