【Java开发实训】day04——可变参数和递归练习

news2024/12/26 23:15:28

目录

一、可变参数

1.1定义

1.2注意

1.3示例

二、递归

2.1定义

2.2注意

2.3示例

2.4练习


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。


一、可变参数

1.1定义

可变参数的语法格式是在方法参数列表中使用三个点号 ... 后跟参数类型和参数名。例如:

public static void myMethod(String... strings) {
    // 方法体
}

在这个例子中,strings 就是可变参数,它会被视为一个 String 类型的数组。

1.2注意

①        本质是数组:可变参数的本质是数组,因此在方法内部可以像操作数组一样处理可变参数。

②        参数位置限制:可变参数不能连续写多个,而且如果可变参数和其他普通参数一起使用时,可变参数必须放在参数列表的最后。

1.3示例

假设我们有一个方法需要计算任意个整数的和:

public class VarArgsExample {

    public static void main(String[] args) {
        int sumResult = sum(1, 2, 3, 4, 5);
        System.out.println("Sum: " + sumResult); 
        int sumResult2 = sum(10, 20, 30);
        System.out.println("Sum: " + sumResult2); 
    }

    // 使用可变参数计算整数的和
    public static int sum(int... numbers) {
        int result = 0;
        for (int num : numbers) {
            result += num;
        }
        return result;
    }
}

在上面的例子中,sum 方法使用了可变参数 int... numbers,允许传递任意数量的整数参数。在 main 方法中,调用 sum 方法并传递不同数量的整数参数,而无需显式创建数组。

二、递归

2.1定义

递归是指一个方法在其内部直接或间接调用自己的过程。它通常用于解决可以分解为相似子问题的问题,例如数学上的阶乘计算或者树结构的遍历。

递归可以分为两种类型:

①        直接递归:方法直接调用自身。

②        间接递归:方法通过调用其他方法间接调用自身,形成一个循环调用链。

2.2注意

①        递归必须要有出口:即递归的终止条件。如果没有终止条件或终止条件不正确,递归将会无限执行下去,导致程序出现"栈内存溢出"(Stack Overflow)错误。

②        递归次数不要太多:即使有正确的终止条件,过多的递归次数也可能导致性能问题或栈溢出。在实际编程中,通常需要根据问题的复杂性和内存限制来合理控制递归的深度。

2.3示例

以下是一个经典的递归例子,计算阶乘:

public class RecursionExample {

    public static void main(String[] args) {
        int n = 5;
        int factorial = calculateFactorial(n);
        System.out.println("Factorial of " + n + " is: " + factorial);
    }

    // 计算阶乘的递归方法
    public static int calculateFactorial(int n) {
        // 终止条件:当 n 为 0 或 1 时,阶乘为 1
        if (n == 0 || n == 1) {
            return 1;
        } else {
            // 递归调用自身
            return n * calculateFactorial(n - 1);
        }
    }
}

上面的例子求的是5的阶乘。calculateFactorial 方法使用了直接递归,它通过调用自身来计算给定数的阶乘。终止条件 if (n == 0 || n == 1) 确保了递归会在 n 减小到 1 或 0 时停止,避免了无限递归。
 

2.4练习

不死神兔的奥秘:故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,问:一对刚出生的兔子,一年内繁殖成多少对兔子?

每个月兔子的对数可以通过斐波那契数列来计算:

第1个月:1对兔子
第2个月:1对兔子
第3个月:2对兔子(第1、2个月的兔子生了新兔子)
第4个月:3对兔子(第2、3个月的兔子生了新兔子)
以此类推...

实现代码:

public class FibonacciRabbits {

    public static void main(String[] args) {
        int months = 12; // 假设计算12个月内兔子的繁殖对数
        int pairs = fibonacci(months);
        System.out.println("Number of rabbit pairs after " + months + " months: " + pairs);
    }

    // 计算斐波那契数列的第 n 项,表示在 n 个月后兔子的对数
    public static int fibonacci(int n) {
        if (n <= 0) {
            return 0;
        } else if (n == 1 || n == 2) {
            return 1;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

fibonacci 方法使用递归来计算斐波那契数列的第 n 项。如果 n 小于等于 0,则返回 0(虽然在实际问题中,月份应该从 1 开始计数,这里用于保证代码健壮性)。如果 n 等于 1 或 2,则返回 1,因为在第一个月和第二个月只有一对兔子。对于其他月份,递归调用 fibonacci(n - 1) + fibonacci(n - 2) 来计算当前月份兔子对数,这正是斐波那契数列的定义。

从运行截图可知,经过12个月后,一开始只有一对兔子的情况下,共繁殖出了144对兔子。

通过这种递归方式,可以很方便地计算任意月份内兔子对数,但需要注意,对于大的月份(如超过40个月),递归可能会变得效率低下,这时可以考虑使用迭代方式实现斐波那契数列来提高性能。


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

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

相关文章

CSS3实现提示工具的渐入渐出效果及CSS3动画简介

上一篇文章用CSS3实现了一个提示工具&#xff0c;本文介绍如何利用CSS3实现提示工具以渐入的方式呈现&#xff0c;以渐出的方式消失。 CSS3主要可以通过两个样式来实现动画效果&#xff1a;animation和transition。 其中&#xff0c;animation需要自己定义一组关键帧从而实现…

css实现前端水印

单处水印 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Watermark Example</title>&l…

昇思25天学习打卡营第24天|应用实践之Pix2Pix实现图像转换

基本介绍 今日要实践的模型是Pix2Pix模型&#xff0c;用于图像转换。使用官方的指定数据集&#xff0c;该数据集是已经经过处理的外墙&#xff08;facades&#xff09;数据&#xff0c;可以直接使用mindspore.dataset的方法读取。由于Pix2Pix模型是基于cGAN&#xff08;条件生成…

SQL常用数据过滤---IN操作符

在SQL中&#xff0c;IN操作符常用于过滤数据&#xff0c;允许在WHERE子句中指定多个可能的值。如果列中的值匹配IN操作符后面括号中的任何一个值&#xff0c;那么该行就会被选中。 以下是使用IN操作符的基本语法&#xff1a; SELECT column1, column2, ... FROM table_name WH…

MQ四兄弟:如何实现延时消息

RabbitMQ延时消息 RabbitMQ 本身并没有直接支持延时消息的功能&#xff0c;但是可以通过使用 RabbitMQ 插件或构建消息死信队列&#xff08;Dead Letter Exchange, DLX&#xff09;的方式来实现延时消息。以下是两种实现延时消息的方法&#xff1a; 1、死信队列 (Dead-Letter …

kubernetes集群部署elasticsearch集群,包含无认证和有认证模式

1、背景&#xff1a; 因公司业务需要&#xff0c;需要在测试、生产kubernetes集群中部署elasticsearch集群&#xff0c;因不同环境要求&#xff0c;需要部署不同模式的elasticsearch集群&#xff0c; 1、测试环境因安全性要求不高&#xff0c;是部署一套默认配置&#xff1b; 2…

【LeetCode】十七、并查集

文章目录 1、并查集Union Find2、并查集find的优化&#xff1a;路径压缩 Quick find3、并查集union的优化&#xff1a;权重标记 1、并查集Union Find 并查集&#xff0c;一种树形的数据结构&#xff0c;处理不相交的两个集合的合并与查询问题。 【参考&#xff1a;&#x1f4…

Linux·基本指令(下)

1. mv 指令 (move) 语法&#xff1a;mv[选项] 源文件或目录 目标文件或目录 功能&#xff1a;将源文件或目录剪贴到一个新位置&#xff0c;或给源文件或目录改名但不会改变其内容 常用选项&#xff1a; -f &#xff1a;force 强制&#xff0c;如果目标文件已经存在&#xff0c;…

Unty 崩溃问题(Burst 1.8.2)

错误代码&#xff1a; Assertion failed on expression: exception SCRIPTING_NULL UnityEngine.StackTraceUtility:ExtractStackTrace () Unity.Burst.BurstCompiler:SendRawCommandToCompiler (string Unity版本&#xff1a;2021.3.17F1&#xff0c;Burst 1.8.2 表现&…

openstack设置IP直接登录,不需要加dashboard后缀

openstack 实验环境&#xff0c;openstack-t版&#xff0c;centos2009 修改配置文件 [rootcontroller ~]# vim /WEBROOT /etc/openstack-dashboard/local_settings #将dashboard去掉 WEBROOT /dashboard/ #改为 WEBROOT /[rootcontroller ~]# vim /etc/httpd/conf.d/openst…

pytorch学习(七):池化层的使用

MaxPool2d&#xff1a; 参数详解&#xff1a; kernel_size: int or tuple。 stride&#xff1a;窗口的步长&#xff0c;默认值是kernel_size的值。&#xff08;卷积层默认值为1&#xff09; dilation&#xff1a;如下图&#xff0c;控制窗口内内元素之间的距离。学名空洞卷积…

浅析stm32启动文件

浅析stm32启动文件 文章目录 浅析stm32启动文件1.什么是启动文件&#xff1f;2.启动文件的命名规则3.stm32芯片的命名规则 1.什么是启动文件&#xff1f; 我们来看gpt给出的答案&#xff1a; STM32的启动文件是一个关键的汇编语言源文件&#xff0c;它负责在微控制器上电或复位…

持续集成05--Gogs的安装与使用

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅程中&#xff0c;版本控制系统是不可或缺的一环。当我们在使用jenkins&#xff0c;想要达到测试脚本有更新&#xff0c;就让项目自动去进行构建&#xff0c;或者当开发脚本有更新&#xff0c;也可以自动去构建的效果…

graham 算法计算平面投影点集的凸包

文章目录 向量的内积&#xff08;点乘&#xff09;、外积&#xff08;叉乘&#xff09;确定旋转方向numpy 的 cross 和 outernp.inner 向量与矩阵计算示例np.outer 向量与矩阵计算示例 python 示例生成样例散点数据图显示按极角排序的结果根据排序点计算向量转向并连成凸包 基本…

linux中关于环境变量的常用的设置方法

一. linux中设置环境变量的方式 1.使用/etc/environment, 是一个全局的环境变量设置文件&#xff0c;它会影响到所有用户和所有进程。当你需要设置一个全局的环境变量时&#xff0c;应该使用这个文件。这个文件的格式是 KEYvalue&#xff0c;每行一个环境变量。 2. 使用/etc/…

Spring Data Redis + Redis数据缓存学习笔记

文章目录 1 Redis 入门1.1 简介1.2 Redis服务启动与停止&#xff08;Windows&#xff09;1.2.1 服务启动命令1.2.2 客户端连接命令1.2.3 修改Redis配置文件1.2.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍 3. Redis常用命令3.1 字符串操作命令3.2 哈希操作…

【学习笔记】虚幻SkeletalMesh学习(一)基础介绍

文章目录 零、前言一、资源介绍1.1 骨架资源1.2 骨架网格体资源 二、UE4中的定义2.1 骨骼数据2.2 模型网格数据 三、渲染3.1 RenderData的初始化3.2 渲染对象的创建3.3 渲染对象的更新3.3.1 游戏线程的更新&#xff08;*FSkeletalMeshObjectGPUSkin::Update*&#xff09;3.3.2 …

大模型“重构”教育:解构学习奥秘,推动教育普惠

大模型“重构”千行百业系列选题 生成式人工智能的热潮&#xff0c;为AI领域的发展注入新的活力&#xff0c;而“赋能千行百业”已经成为人们普遍对于人工智能和大模型的全新理解。 人工智能和大模型技术的迅猛发展正在以前所未有的速度深刻改变着各个行业。正如专家所预测&a…

《昇思25天学习打卡营第23天|onereal》

第23天学习内容简介&#xff1a; ----------------------------------------------------------------------------- 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 1 环境配置 配置网络线路 2 代码开发 下载权重大约需要10分钟 ------------------------------- 运…

汇总国内镜像提供了Redis的下载地址

文章目录 1. 清华大学开源软件镜像站&#xff1a;2. 中国科技大学开源软件镜像&#xff1a;3. 阿里云镜像&#xff1a;4. 华为云镜像&#xff1a;5. 腾讯云镜像&#xff1a;5. 官方GitHub仓库&#xff08;虽然不是镜像&#xff0c;但也是一个可靠的下载源&#xff09;&#xff…