藍橋杯 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.pswp.cn/news/895206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據倉庫和商務智能:洞察數據,驅動決策

在數據管理的眾多領域中,數據倉庫和商務智能(BI)是將數據轉化為洞察力、支持決策制定的關鍵環節。它們通過整合、存儲和分析數據,幫助組織更好地理解業務運營,預測市場趨勢,從而制定出更明智的戰略。今天&a…

C++---命名空間

目錄 c語言中的問題命名空間的定義注意事項第一點:同名命名空間第二點:命名空間中的全局變量與局部變量 命名空間的使用第一種使用方法第二種使用方法第三種使用方法 注意事項第一點:沒有名字的命名空間第二點:局部優先原則第三點…

Prompt逆向工程:如何“騙“大模型吐露其Prompt?

提示詞的“逆向工程”,讓AI大語言模型幫你反推提示詞 一、前言 在日常生活中,我們不時會遇到一些令人驚艷的文本,不論是一篇精彩絕倫的小說、一篇深入淺出的科普文章,還是一篇充滿熱情的音樂推薦,它們都能在我們的心…

Android studio常量表達式的錯誤

case R.id.openSerial485: 異常 在Android Studio中遇到“錯誤: 需要常量表達式”通常是因為在需要編譯時常量的地方使用了變量。以下是常見場景及解決方法: 1. switch 語句中的 case 標簽 Java要求case標簽必須是常量表達式(如字面量或final常量&…

【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成為當前最熱的現象級…

conda將python低版本環境升級到高版本

conda將python低版本環境3.7.16升級到高版本3.8 1. 激活你的Conda環境2. 升級Python版本3. 驗證升級4. 處理依賴問題5. 測試環境注意事項 可以將Conda環境中的Python版本從3.7.16升級到3.8。以下是具體步驟: 1. 激活你的Conda環境 首先,你需要激活你想要…

day10-字符串

目錄 字符串1、API 和 API 幫助文檔2、String概述3、String構造方法代碼實現 和 內存分析3.1 創建String對象的兩種方式3.2 Java的內存模型 4、字符串的比較4.1 號的作用4.2 equals方法的作用 練習5、用戶登錄6、遍歷字符串和統計字符個數7、字符串拼接和翻轉8、較難練習-金額轉…

互聯網協議套件中的服務類型(RFC 1349)技術解析與總結

1. 背景與核心目標 RFC 1349 是對 IP 協議頭部 服務類型(Type of Service, TOS)字段語義的更新與澄清文檔,發布于 1992 年。其主要目標包括: 重新定義 TOS 字段的用途:明確 TOS 字段的語義,解決歷史標準中的…

使用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…

洛谷P3397 地毯(二維差分加暴力法)

題目難度:普及一 題目傳送門 地毯 題目描述 在 n n n\times n nn 的格子上有 m m m 個地毯。 給出這些地毯的信息,問每個點被多少個地毯覆蓋。 輸入格式 第一行,兩個正整數 n , m n,m n,m。意義如題所述。 接下來 m m m 行&#…

使用OBS推流,大華攝像頭 srs服務器播放

說明: ffmpeg可以推流,但是是命令行方式不太友好,還可以使用主流的OBS開源推流軟件,可從官網Open Broadcaster Software | OBS 下載最新版本,目前很多網絡主播都是用它做直播。該軟件支持本地視頻文件以及攝像頭推流。…

從大規模惡意攻擊 DeepSeek 事件看 AI 創新隱憂:安全可觀測體系建設刻不容緩

作者:羿莉(蕭羿) 全球出圈的中國大模型 DeepSeek 作為一款革命性的大型語言模型,以其卓越的自然語言處理能力和創新性成本控制引領行業前沿。該模型不僅在性能上媲美 OpenAI-o1,而且在推理模型的成本優化上實現了突破…

mac下dify+deepseek部署,實現私人知識庫

目前deepseek 十分火爆,本地部署實現私有知識庫,幫助自己日常工作,上一篇使用工具cherry studio可以做到私人知識庫。今天學習了一下,使用Dify鏈接deepseek,實現私人知識庫,也非常不錯,這里分享…

C++性能優化—人工底稿版

C以高性能著稱,性能優化是C程序員繞不過去的一個話題,性能優化是一個復雜、全局而又細節的問題,本文總結C性能分析中常用的知識。 性能優化的時機 大部分關于性能優化的文章都強調:不要過早的進行性能優化。 C編碼層面 數據結…

react概覽webpack基礎

react概覽 課程介紹 webpack 構建依賴圖->bundle 首屏渲染: 減少白屏等待時間 數據、結構、樣式都返回。需要服務器的支持 性能優化 ***webpack干的事情 模塊化開發 優勢: 多人團隊協作開發 可復用 單例:全局沖突 閉包 模塊導入的順序 req…

ASP.NET Core SignalR實踐指南

Hub類的生命周期是瞬態的,每次調用集線器的時候都會創建一個新的Hub類實例,因此不要在Hub類中通過屬性、成員變量等方式保存狀態。如果服務器的壓力比較大,建議把ASP.NET Core程序和SignalR服務器端部署到不同服務器上,以免它們互…

常見的九種二極管

常見的九種二極管 文章目錄 常見的九種二極管1、普通二極管2、光電二極管(LED)3、變容二級管4、發光二極管5、恒流二極管6、快恢復二極管(FRD)7、肖特基二極管8、瞬態電壓抑制二極管(TVS)9、齊納二極管(穩壓&#xff0…