Java递归问题

news2024/10/1 5:27:00

3 递归

3.1 递归基础

  • 递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象
  • 递归解决问题的思路
    • 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求
    • 解递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
  • 递归解决问题要找到两个内容
    • 递归出口:否则会出现内存溢出
    • 递归规则:与原问题相似的规模较小的问题
public class Demo {
    public static void main(String[] args) {
        //回顾不死神兔:每个月兔子个数:1、1、2、3、5、8...;求第20月的兔子个数
        int arr[] = new int[20];

        arr[0] = 1;
        arr[1] = 1;
        for(int i=2;i< arr.length;i++) {
            arr[i] = arr[i-1] + arr[i-2];
        }
        System.out.println(arr[19]); //6765

//        f(20); //1,java.lang.StackOverflowError:当堆栈溢出发生时抛出一个应用程序递归抬深
        System.out.println(f(20)); //6765

    }
	//递归解决问题首先定义个方法
    public static int f(int n) {
    	//1,return f(n-1)+f(n-2);
    	//2,给出递归出口防止内存溢出
        if(n==1 || n==2) {
            return 1;
        }else {
            return f(n-1)+f(n-2);
        }
    }
}

3.2 案例1:递归求阶层

在这里插入图片描述
在这里插入图片描述

  • 内存图解
    在这里插入图片描述
public class Demo {
    public static void main(String[] args) {
        int number = jc(5);
        System.out.println(number); //120
    }

    public static int jc(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n * jc(n - 1);
        }
    }
}

3.3 案例2:遍历目录

在这里插入图片描述

import java.io.File;
import java.io.IOException;


public class FileDemo {
    public static void main(String[] args) throws IOException {
        //1:根据给定的路径创建一个File对象
        File srcfile  = new File("E:\\test");

        // 6:调用方法
        getAllFilePath(srcfile);
    }
    //2:定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
    public static void getAllFilePath(File srcfile) {
        //3:获取给定的File目录下所有的文件或者目录的File数组
        File[] fileArray = srcfile.listFiles();
        if(fileArray != null) {
            //4:遍历该File数组,得到每一个File对象
            for(File file:fileArray) {
                //5:判断该File对象是否是目录
                //public boolean isDirectory() 	判断此抽象路径名表示的File是否为目录
                if(file.isDirectory()) {
                    //是,递归调用,这此目录回到操作3
                    getAllFilePath(file);
                }else {
                    //不是:获取绝对路径输出在控制台
                    //public String getAbsolutePath() 	返回此抽象路径名的绝对路径名字符串
                    System.out.println(file.getAbsoluteFile());
                }
            }
        }
    }
}

3.4 案例3:汉罗塔问题

在这里插入图片描述

汉诺塔问题描述

  • 有3根柱子A、B、C,A柱上有n个盘子,盘子的大小不等,大的盘子在下,小的盘子在上。
  • 要求将A柱上的n个盘子移到C柱上,每次只能移动一个盘子。
  • 在移动过程中,可以借助于任何一根柱子(A、B、C),但必须保证3根柱子上的盘子都是大的盘子在下,小的盘子在上。

思路

  • 可以理解成只有两种情况,当其中只有一个盘子,直接从A移动到C
  • 当有两个的时候将第一个移动到B,最下面的移动到C,再将第一个移动到C
  • 所以当有n个的时候,将上面的 n-1 当做一个整体移动到B,将 n 移动到C,再将上面的 n-1 移动到C

实现类

public class Hanoi {
    public static void main(String[] args) {
        hanoi(3,'A','B','C');
//        第1个盘子从A移动到C
//        第2个盘子从A移动到B
//        第1个盘子从C移动到B
//        第3个盘子从A移动到C
//        第1个盘子从B移动到A
//        第2个盘子从B移动到C
//        第1个盘子从A移动到C
    }

    //n:n个盘子,x:开始的柱子,y:中间的柱子,z:目标柱子
    public static void hanoi(int n,char x,char y,char z) {
        if(n==1) {
            System.out.println("第1个盘子从"+x+"移动到"+z);
        //无论有多少个盘子都认为只有两个。上面所有盘子为n-1,下面为n
        }else {
            //将前面n-1个盘子移到中间位置
            hanoi(n-1,x,z,y);
            //移动下面的盘子到目标位置
            System.out.println("第"+n+"个盘子从"+x+"移动到"+z);
            //把上面n-1个盘子从中间位置移动到目标位置
            hanoi(n-1,y,x,z);
        }
    }
}

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

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

相关文章

CHAPTER 3 Zabbix Grafana

Zabbix & Grafana3.1 Grafana简介3.2 安装grafana3.3 启动grafana3.4 登录控制台3.5 链接zabbix1.安装zabbix插件2.启用插件3.链接数据源4.导入仪表盘5.创建仪表板6.创建仪表盘7.添加自建监控项8.监控信息3.1 Grafana简介 Grafana是一款开源的数据可视化工具&#xff0c;使…

多商户java版小程序+公众号+h5+app秒杀拼团砍价分销商城源码

三勾多商户商城小程序、支持多端发布&#xff0c;一套代码发布到8个平台&#xff0c;面向开发&#xff0c;方便二次开发 项目介绍 三勾多商户小程序商城基于springbootelement-uiuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&…

做软文发布需要注意哪些细节?

软文发布是一种有效的网络营销和推广活动&#xff0c;它以媒体等形式把产品信息植入到软文报道或新闻中&#xff0c;进行心理暗示和引导销售&#xff0c;进行正面宣传以及促进销售的新型网络营销方式&#xff0c;它不但能够有效地推行产品宣传、也能有效地提高网络曝光率&#…

【Kafka进阶】-- unclean.leader.election.enable参数的内涵

一、背景近期&#xff0c;我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机&#xff0c;导致 log 文件损坏&#xff0c;重启 kafka 失败&#xff0c;最后导致某个 topic 的分区不可用&#xff0c;本文对此做了简单的分析、解决和复现参考&#xff0c;以此为记…

opencv图像处理

CV模块 基本操作 T1家全叫米TF,拍 图像的IO操作&#xff0c;读取和保存方法在图像上绘制几何图形 怎么获取图像的属性 怎么访问图像的像素&#xff0c;进行通道分离&#xff0c;合并等 怎么实现颜色空间的变换 图像的算术运算 掌握图像的读取和保存方法 # 读取图像 cv.imrea…

Spring Boot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除

一、整个 Quartz 的代码流程基本基本如下&#xff1a;首先需要创建我们的任务(Job)&#xff0c;比如取消订单、定时发送短信邮件之类的&#xff0c;这是我们的任务主体&#xff0c;也是写业务逻辑的地方。创建任务调度器(Scheduler)&#xff0c;这是用来调度任务的,主要用于启动…

【Unity细节】RigidBody中Dynamic和Kinematic的区别

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐Dynamic和Kinematic的区别⭐ 文章目录⭐Dynamic和Kinematic的区别⭐&#x1f3…

恰饭近800w播放,官方涨粉5000,B站用户直呼“巅峰制作”!

开年之际&#xff0c;QQ飞车在B站打造了一场「2023QQ飞车手游新春会」&#xff0c;并宣布首款女性机甲、赛车皮肤即将上线&#xff0c;携手玩家一起狂欢。来源-B站17日当晚&#xff0c;QQ飞车官方号在B站直播间举办「2023QQ飞车手游新春会」直播活动&#xff0c;共有11位UP主参…

二十五、Gtk4-多线程分析

1 回顾 1.1 Gnome相关 首先回顾一下GLib&#xff0c;GObject&#xff0c;GIO&#xff0c;Gtk的不同&#xff0c;因为下面会涉及到这些概念里面的函数。 所有这些都是由Gnome项目开发的库&#xff0c;一般都用于Gnome环境相关的应用程序。 Gtk&#xff1a;GUI界面库。GLib&a…

esxi不能识别不兼容网卡解决方案

相信很多网友在安装测试VMWARE Esxi 6.0的时候&#xff0c;总会遇到无法兼容网卡的情况&#xff0c;本人也是遇到了再组装的台式机上测试ESXI 6.0的时候&#xff0c;无法识别REALTEK RTL 8111E的情况。 找了很多网友提供的博客&#xff0c;方法是正确的&#xff0c;但是不够严…

Vue3 中实现关键字高亮的一种思路

前言&#xff1a; 这几天在项目中遇到了需要将用户在搜索框中输入的文字高亮的效果&#xff0c;思考了很久&#xff0c;暂时没有想到更优雅的解决方式&#xff0c;于是采用了最简单的一种思路来实现&#xff0c;特来记录一下。 一. 需求的场景 我接手的这个需求需要和后端搭配&…

搞量化先搞数(下):A股历史行情免费抓取实战

上一节我们学习了如何抓取A股的股票列表,我们成功地将股票列表保存到了本地文件(或数据库)中。那么这一节,我们就来看下如何免费获取A股的历史行情数据。文末附全套代码。 一、寻找提供行情数据的网站 首先我们百度搜索一支股票的名字+行情,看下都哪些网站提供该数据。 …

Docker getting started

系列文章目录 Docker 概述 Docker getting started 文章目录系列文章目录前言一、容器及镜像的概念二、容器化一个应用三、更新应用四、分享应用五、持久化数据存储volume mount 和 bind mount比较Container volumesbind mounts六、跨多容器的应用七、Docker 其它八、Docker 图…

学习 Linux 内核书籍推荐

原文链接&#xff0c;欢迎关注&#xff1a; 你为什么学习 Linux 内核&#xff1f; - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/31369673/answer/2894981254 主要是工作需要&#xff0c;其实对于我自己的工作来说&#xff0c;在Linux开发的具体业务和算法才是重…

2023年PMP考试难不难?

整个考试的考察方向转向还是比较大的&#xff0c;基本上以“价值传递”和“以人为本”这两个出发点来考察项目经理所需要的能力。 1}新版提纲题目数量的变化 总题量从200道减少到180道&#xff0c;所以答题时间上相对变的宽裕一些。考试时间230分钟&#xff0c;中间有十分钟休…

前端状态管理:Vuex、Flux、Redux、MobX概念篇

概念准备 【状态管理模式】 可以借鉴 Vuex 官方文档的解释&#xff1a;什么是“状态管理模式” 状态管理的目标&#xff08;意义&#xff09; 各组件通过数据响应机制对共享状态进行高效的状态更新&#xff0c;说白了就是不同组件对需要共享的数据的变更和同步。 1. Vuex …

学网络运维与安全前景怎么样?

近几年&#xff0c;网络安全问题频频爆发&#xff0c;多数人看不到背后的隐患&#xff0c;但是&#xff0c;企业却因此损失惨重。比如&#xff1a;FaceBook数据泄露2018年上半年&#xff0c;FaceBook 5000万用户数据泄露&#xff0c;导致其市值蒸发360亿美元,品牌遭遇声誉危机。…

markdown和latex常用部分参考@注脚@链接跳转@csdn

文章目录refmarkdown和latex常用部分参考typora文档基础语法扩展语法链接内联链接的方式将链接提取出来链接示例typora的支持LinksInline LinksInternal Links&#x1f388;Reference LinksURLs文章内部跳转(Heading IDs)&#x1f388;My Great Heading注脚(Footnotes)&#x1…

攻防世界1.新手练习区

4.攻防世界1.新手练习区 1.view_source 访问url&#xff1a; http://111.200.241.244:48855/ 鼠标点击右键不起作用&#xff0c;F12审查元素 得到flag为cyberpeace{0f3a3e4ab8c8664f3cf40d4240ec7b53} 2.robots 访问url&#xff1a; http://111.200.241.244:34362/ rob…

VMware vSphere 8.0b 发布下载 - 企业级工作负载平台

ESXi 8.0.0b & vCenter Server 8.0.0b GA (General Availability) 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 2023-02-14&#xff0c;vSphe…