蓝桥杯 Java B 组之函数定义与递归入门

一、Java 函数(方法)基础

1. 什么是函数?

函数(方法)是 一段可复用的代码块,通过 函数调用 执行,并可返回值。在 Java 里,函数也被叫做方法,它是一段具有特定功能的、可重复使用的代码块。函数能够把复杂的问题分解成小的子问题,提升代码的可读性与可维护性。

Java 方法的格式:

修饰符 返回值类型 函数名(参数列表)

 { // 函数体 return 返回值; // 如果返回值类型是 void,则不需要 return 语句

 }

  • 修饰符:像 publicprivatestatic 等,用于限定函数的访问权限和特性。
  • 返回值类型:函数执行完毕后返回结果的数据类型,若不返回任何值,使用 void
  • 函数名:给函数起的名称,要遵循命名规范。
  • 参数列表:传递给函数的参数,多个参数用逗号分隔。
  • 函数体:实现具体功能的代码。
  • 返回值:使用 return 语句返回函数的执行结果。


2. Java 方法定义

(1)无参数无返回值

public static void sayHello() {

    System.out.println("Hello, 蓝桥杯!");

}

调用:

sayHello();

(2)有参数有返回值

public static int add(int a, int b) {

    return a + b;

}

调用:

int sum = add(5, 3);  // sum = 8


3. 递归函数

递归(Recursion)是函数自己调用自己

1. 递归的概念

递归是指在函数的定义中使用函数自身的方法。递归包含两个关键要素:

基线条件(终止条件):能够直接得出结果,不再进行递归调用的条件,避免无限递归。

递归条件:函数调用自身来解决规模更小的子问题。

通常用于:

  • 数学计算(如阶乘、斐波那契数列)
  • 问题拆解(如汉诺塔、深度优先搜索)


二、递归的基本概念

1. 递归的两部分

(1)基准情况(终止条件):防止无限递归
(2)递归关系(拆分问题):将大问题分解成小问题

示例:递归求 n!

public static int factorial(int n) {if (n == 0 || n == 1) {  // 终止条件return 1;}return n * factorial(n - 1);  // 递归调用}调用:System.out.println(factorial(5));  // 5! = 120


三、练习 1:递归求阶乘

题目描述

输入 n,求 n!(n 的阶乘)。

输入示例

5

输出示例

120

Java 代码

import java.util.Scanner;public class Main {public static int factorial(int n) {if (n == 0 || n == 1) {return 1;}return n * factorial(n - 1);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();System.out.println(factorial(n));}}

考点

  • 递归终止条件:n == 0 || n == 1
  • 递归调用:n * factorial(n - 1)
  • 时间复杂度 O(n)

⚠️ 易错点

  • 没有终止条件,导致无限递归
  • n 太大时可能导致栈溢出(StackOverflowError


四、练习 2:递归求斐波那契数列

1. 斐波那契数列定义

F(n)=F(n−1)+F(n−2)

其中:

  • F(0) = 0
  • F(1) = 1


题目描述

输入 n,输出斐波那契数列的第 n 项。

输入示例

6

输出示例

8


Java 代码

import java.util.Scanner;public class Main {public static int fibonacci(int n) {if (n == 0) {return 0;} else if (n == 1) {return 1;}return fibonacci(n - 1) + fibonacci(n - 2);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();System.out.println(fibonacci(n));}}

✅代码解释:

当 n 为 0 时返回 0,当 n 为 1 时返回 1,这是基线条件。

当 n 大于 1 时,函数调用自身 fibonacci(n - 1) 和 fibonacci(n - 2) 并将结果相加,这是递归条件。

 考点

  • 递归终止条件:n == 0 或 n == 1
  • 递归公式:F(n) = F(n-1) + F(n-2)
  • 时间复杂度 O(2^n)(指数级,效率低)

⚠️ 易错点

  • 直接递归 O(2^n) 太慢,n 较大时严重超时
  • 优化方案使用数组存储已计算值(记忆化递归)


五、练习 3:汉诺塔问题

1. 题目介绍

汉诺塔问题:汉诺塔问题是一个经典的递归问题,目标是把所有盘子从一根柱子移动到另一根柱子,每次只能移动一个盘子,且大盘子不能放在小盘子上面。

  1. 有 n 个盘子,从 A 移到 C,借助 B
  2. 规则
    • 一次只能移动一个盘子
    • 不能将大盘子放在小盘子上


输入

3

输出

Move disk 1 from A to C

Move disk 2 from A to B

Move disk 1 from C to B

Move disk 3 from A to C

Move disk 1 from B to A

Move disk 2 from B to C

Move disk 1 from A to C


Java 代码

import java.util.Scanner;public class Main {public static void hanoi(int n, char from, char aux, char to) {if (n == 1) {System.out.println("Move disk 1 from " + from + " to " + to);return;}hanoi(n - 1, from, to, aux);System.out.println("Move disk " + n + " from " + from + " to " + to);hanoi(n - 1, aux, from, to);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();hanoi(n, 'A', 'B', 'C');}}

代码解释

  • 当 n 为 1 时,直接将盘子从源柱子移动到目标柱子,这是基线条件。
  • 当 n 大于 1 时,先把 n - 1 个盘子从源柱子借助目标柱子移动到辅助柱子,再把第 n 个盘子从源柱子移动到目标柱子,最后把 n - 1 个盘子从辅助柱子借助源柱子移动到目标柱子,这是递归条件。

考点

  • 递归拆解
    1. 移动 n-1 个盘子 A → B
    2. 移动第 n 个盘子 A → C
    3. 移动 n-1 个盘子 B → C
  • 时间复杂度 O(2^n)

⚠️ 易错点

  • if (n == 1) 不能少,否则死循环
  • hanoi(n - 1, from, to, aux) 和 hanoi(n - 1, aux, from, to) 位置不能搞错


六、蓝桥杯递归常考点

考点

典型题目

难点

递归求阶乘

n! = n * (n-1)!

终止条件 n == 1

递归求斐波那契

F(n) = F(n-1) + F(n-2)

优化记忆化递归

汉诺塔

递归移动盘子

移动顺序和 O(2^n)


七、递归的易错点总结

1. 基线条件缺失或错误

如果基线条件不正确或者缺失,会导致无限递归,最终引发栈溢出异常。

2. 重复计算问题

在递归过程中,可能会出现大量的重复计算,比如斐波那契数列递归实现,会使时间复杂度呈指数级增长。可以使用记忆化搜索或迭代方法来优化。

3. 递归深度过大

当递归深度过大时,会占用大量的栈空间,容易导致栈溢出。要注意递归深度的控制,必要时转换为迭代实现。

递归核心思想

1. 递归三要素

终止条件(Base Case):递归何时结束。

递归步骤(Recursive Step):如何将问题分解为更小的子问题。

问题规模缩小:每次递归调用应使问题更接近终止条件。

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

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

相关文章

数据仓库和商务智能:洞察数据,驱动决策

在数据管理的众多领域中,数据仓库和商务智能(BI)是将数据转化为洞察力、支持决策制定的关键环节。它们通过整合、存储和分析数据,帮助组织更好地理解业务运营,预测市场趋势,从而制定出更明智的战略。今天&a…

C++---命名空间

目录 c语言中的问题命名空间的定义注意事项第一点:同名命名空间第二点:命名空间中的全局变量与局部变量 命名空间的使用第一种使用方法第二种使用方法第三种使用方法 注意事项第一点:没有名字的命名空间第二点:局部优先原则第三点…

【UI设计】可视化大屏原型设计

文章目录 一、墨刀中的几个可视化大屏框架原型 一、墨刀中的几个可视化大屏框架原型

【推理llm论文精度】DeepSeek-R1:强化学习驱动LLM推理能力飞跃

最近deepseek R1模型大火,正好复习一下他家的技惊四座的论文https://arxiv.org/pdf/2501.12948 近年来,大型语言模型(LLM)在推理能力上取得了显著进展,但如何进一步有效提升仍然是研究热点。DeepSeek-AI发布了 DeepS…

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全

2月7日,启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF(Model Application Firewall)大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…

day10-字符串

目录 字符串1、API 和 API 帮助文档2、String概述3、String构造方法代码实现 和 内存分析3.1 创建String对象的两种方式3.2 Java的内存模型 4、字符串的比较4.1 号的作用4.2 equals方法的作用 练习5、用户登录6、遍历字符串和统计字符个数7、字符串拼接和翻转8、较难练习-金额转…

使用git commit时‘“node“‘ 不是内部或外部命令,也不是可运行的程序

第一种: 使用git commit -m "xxx"时会报错,我看网上的方法是在命令行后面添加--no-verify:git commit -m "主题更新" --no-verify,但是不可能每次都添加。 最后解决办法是:使用git config --lis…

DeepSeek从入门到精通:全面掌握AI大模型的核心能力

文章目录 一、DeepSeek是什么?性能对齐OpenAI-o1正式版 二、Deepseek可以做什么?能力图谱文本生成自然语言理解与分析编程与代码相关常规绘图 三、如何使用DeepSeek?四、DeepSeek从入门到精通推理模型推理大模型非推理大模型 快思慢想&#x…

使用OBS推流,大华摄像头 srs服务器播放

说明: ffmpeg可以推流,但是是命令行方式不太友好,还可以使用主流的OBS开源推流软件,可从官网Open Broadcaster Software | OBS 下载最新版本,目前很多网络主播都是用它做直播。该软件支持本地视频文件以及摄像头推流。…

从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓

作者:羿莉(萧羿) 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型,以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1,而且在推理模型的成本优化上实现了突破…

mac下dify+deepseek部署,实现私人知识库

目前deepseek 十分火爆,本地部署实现私有知识库,帮助自己日常工作,上一篇使用工具cherry studio可以做到私人知识库。今天学习了一下,使用Dify链接deepseek,实现私人知识库,也非常不错,这里分享…

react概览webpack基础

react概览 课程介绍 webpack 构建依赖图->bundle 首屏渲染: 减少白屏等待时间 数据、结构、样式都返回。需要服务器的支持 性能优化 ***webpack干的事情 模块化开发 优势: 多人团队协作开发 可复用 单例:全局冲突 闭包 模块导入的顺序 req…

常见的九种二极管

常见的九种二极管 文章目录 常见的九种二极管1、普通二极管2、光电二极管(LED)3、变容二级管4、发光二极管5、恒流二极管6、快恢复二极管(FRD)7、肖特基二极管8、瞬态电压抑制二极管(TVS)9、齐纳二极管(稳压&#xff0…

LabVIEW在呼吸机测试气体容量计算

在呼吸机测试中,精确测量气体容量变化是评估设备性能的关键步骤。通过监测呼吸机气道内的压力变化,并结合流阻和肺顺应性等参数,可以计算出单位时间内的气体容量变化。本案例基于LabVIEW实现该计算过程,以确保测试数据的准确性和一…

本地部署DeepSeek R1 + 界面可视化open-webui

本地部署DeepSeek R1 界面可视化open-webui ollama是物理机本地安装 open-webui是容器启动 另外,用docker 部署ollama也很方便ollama docker 安裝部署ollama ollama官网 安装 Linux上安装: curl -fsSL https://ollama.com/install.sh | sh使用命令行管理 拉…

使用C语言实现MySQL数据库的增删改查操作指南

使用C语言与MySQL数据库进行交互,通常涉及使用MySQL提供的C API库。这套API允许开发者在C/C++程序中执行SQL查询,从而实现数据库的增删改查操作。下面,我将详细介绍如何在C语言中实现这些基本操作。 准备工作 安装MySQL开发库:确保你的系统上安装了MySQL服务器以及MySQL开发…

在CT107D单片机综合训练平台上实现外部中断控制LED闪烁

引言 在单片机开发中,外部中断是一个非常重要的功能,它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能:一种是在…

重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba

*本文作者系阿里云云原生微服务技术负责人,Spring AI Alibaba 发起人彦林,望陶和隆基对可观测和 RocketMQ 部分内容亦有贡献。 * 摘要 随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 Lang…

防御保护作业二

拓扑图 需求 需求一: 需求二: 需求三: 需求四: 需求五: 需求六: 需求七: 需求分析 1.按照要求进行设备IP地址的配置 2.在FW上开启DHCP功能,并配置不同的全局地址池,为…

MapReduce简单应用(三)——高级WordCount

目录 1. 高级WordCount1.1 IntWritable降序排列1.2 输入输出格式1.3 处理流程 2. 代码和结果2.1 pom.xml中依赖配置2.2 工具类util2.3 高级WordCount2.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0,详情请参阅 Apache许可证2.0。 1. 高级WordCo…