算法模型從入門到起飛系列——遞歸(探索自我重復的奇妙之旅)

文章目錄

  • 前言
  • 一、遞歸本質
    • 1.1 遞歸的要素
    • 1.2 遞歸特點
  • 二、遞歸&迭代
    • 2.1 遞歸&迭代比較
    • 2.2 遞歸&迭代如何實現相同功能
      • 2.2.1 遞歸實現
      • 2.2.2 迭代實現
      • 2.2.3 性能對比
  • 三、優雅的遞歸理解
    • 3.1 階乘計算分解
    • 3.2 [DFS](https://blog.csdn.net/qq_38315952/article/details/146374720?spm=1001.2014.3001.5501)分解
  • 四、尾遞歸優化(Tail Call Optimization, TCO)
    • 4.1 尾遞歸優化概念
    • 4.2 尾遞歸優化演示
  • 五、哪些問題更適合遞歸解決
    • 1. 數學問題
    • 2. 分治算法
    • 3. 樹形結構遍歷
    • 4. 回溯算法
    • 5. 動態規劃問題
    • 6. 解析嵌套結構
    • 7. 遞歸關系明確的問題
  • 獻給讀者


在這里插入圖片描述
在這里插入圖片描述


前言

在編程的世界里,遞歸是一種既神秘又強大的工具。它宛如一個魔法盒子,能夠將復雜的問題簡化為更小規模的相同問題,直至找到最基礎、可以直接解決的情況。無論是優雅地遍歷復雜的樹形結構,還是巧妙地解開經典的漢諾塔謎題,遞歸都能以其獨特的方式展現其非凡的魅力。

遞歸的核心在于函數直接或間接地調用自身,這一過程看似簡單,實則蘊含著深邃的邏輯和無限的可能性。通過遞歸,我們可以構建出簡潔而富有表現力的代碼,使得解決方案看起來自然而直觀。然而,正如任何強大的工具一樣,遞歸也有其雙刃劍的一面:如果使用不當,可能會導致程序陷入無限循環,或是消耗過多的系統資源,甚至引發棧溢出錯誤。

本書旨在深入探討遞歸的概念、應用及其背后的設計哲學。我們將從最基本的原則出發,逐步揭開遞歸的神秘面紗,揭示其在算法設計、數據結構處理以及實際軟件開發中的廣泛應用。無論你是編程新手,渴望理解遞歸的基礎知識;還是經驗豐富的開發者,希望進一步掌握遞歸優化技巧,本書都將為你提供寶貴的見解和實用的指導。

讓我們一同踏上這段探索遞歸奧秘的旅程,在不斷的實踐中體會其帶來的樂趣與挑戰,共同解鎖編程藝術中這扇獨特的門扉。準備好迎接這場自我重復的奇妙之旅了嗎?前方等待著你的,是更加深刻的理解和無盡的創造可能。

一、遞歸本質

遞歸是一種在編程和數學中使用的方法,它指的是一個函數或過程直接或間接地調用自身。遞歸通常用于解決可以被分解為更小的相同問題的問題。這種方法非常強大,但需要小心使用,因為它可能導致無限循環或其他錯誤,如果設計不當的話。

💡貼士:遞歸核心就是調用自己,自我分解,化繁為簡。

1.1 遞歸的要素

  1. 基準情況(Base Case):這是遞歸過程中的終止條件,用來停止遞歸調用。沒有有效的基準情況會導致無限遞歸,最終可能耗盡系統資源或導致棧溢出錯誤。
  2. 遞歸步驟(Recursive Step):這是將問題規模減小,并朝向基準情況前進的步驟。在這個過程中,函數會調用自己并傳入較小規模的問題參數。

1.2 遞歸特點

  1. 自我調用
    遞歸的核心特點是函數直接或間接地調用自身。通過這種方式,復雜的問題可以被分解為更小、更易管理的子問題,直到達到一個可以直接解決的基礎情況(基準情況)。

  2. 基準情況(Base Case)
    每個遞歸函數都必須定義至少一個基準情況,作為遞歸終止的條件。基準情況是遞歸過程中最簡單的情況,不需要進一步遞歸來解決。缺乏有效的基準情況會導致無限遞歸,最終可能引發棧溢出錯誤。

  3. 遞歸步驟(Recursive Step)
    在遞歸步驟中,問題被分解為一個或多個較小規模的相同問題,并通過再次調用遞歸函數來求解這些子問題。遞歸步驟的設計至關重要,它決定了遞歸過程能否逐步接近基準情況,從而正確終止。

  4. 空間復雜度高
    每次遞歸調用都會在調用棧上創建一個新的幀,用于保存局部變量和返回地址等信息。因此,遞歸可能會消耗大量的內存,特別是在深度遞歸的情況下,這可能導致棧溢出錯誤。相比之下,迭代通常需要較少的額外空間。

  5. 可能存在性能開銷
    由于函數調用本身有一定的開銷,包括參數傳遞、局部變量初始化以及控制權轉移等,遞歸可能會比等效的迭代實現慢。此外,重復計算相同子問題的情況(如未優化的斐波那契數列計算)也可能導致效率低下。

  6. 提升代碼可讀性
    對于某些類型的問題,如樹遍歷、圖搜索算法和分治算法,使用遞歸可以使代碼更加簡潔明了,易于理解和維護。遞歸結構能夠直觀地反映問題的本質,使得解決方案看起來自然而優雅。

  7. 尾遞歸優化
    一些現代編程語言支持尾遞歸優化(Tail Call Optimization, TCO),在這種情況下,如果遞歸調用是函數執行的最后一步且不需保留當前調用的狀態,則編譯器或解釋器可以優化該遞歸調用以減少棧空間的使用,甚至將其轉換為迭代形式,從而提高效率并避免棧溢出風險。

了解這些特點有助于合理選擇何時使用遞歸解決問題,并采取適當措施優化遞歸函數的表現。無論是為了提升代碼的清晰度還是性能,掌握遞歸的特點都是編程技能中的重要一環。

二、遞歸&迭代

2.1 遞歸&迭代比較

特性遞歸迭代
定義函數直接或間接調用自身來解決問題使用循環結構重復執行一段代碼,直到滿足特定條件
基準情況必須明確至少一個終止條件(基準情況),以避免無限遞歸通過循環條件控制終止,無需顯式定義基準情況
代碼風格對于某些問題(如樹遍歷、分治算法)更加直觀和簡潔通常需要手動管理循環變量和狀態,代碼可能較冗長但清晰
空間復雜度每次遞歸調用都會在棧上創建一個新的幀,可能導致較高的內存消耗空間效率高,因為只需要固定的額外空間來存儲循環變量
性能可能存在函數調用開銷,特別是深度遞歸時可能導致棧溢出錯誤通常比遞歸更高效,因為它避免了函數調用的額外開銷
適用場景天然適合處理具有自我相似性質的問題(如樹形結構、圖搜索等)更適合解決可以通過簡單的循環來解決的問題
優化可能性支持尾遞歸優化(部分語言),可以減少棧空間使用不需要特殊的優化,但在某些情況下可能需要考慮循環不變量的優化
示例應用階乘計算、斐波那契數列、漢諾塔、快速排序、歸并排序階乘計算、斐波那契數列、線性搜索、二分查找

2.2 遞歸&迭代如何實現相同功能

為了更清楚地理解遞歸和迭代如何實現相同的功能,我們可以以計算階乘為例。階乘n!定義為從1到n的所有正整數的乘積(0! = 1)。下面是使用遞歸和迭代兩種方法來實現這一功能的例子。

2.2.1 遞歸實現

public class Factorial {// 遞歸方法計算階乘public static int factorialRecursive(int n) {if (n == 0 || n == 1) {return 1;} else {return n * factorialRecursive(n - 1);}}public static void main(String[] args) {// 測試階乘函數int number = 5;  // 你可以更改這個值來測試不同的輸入System.out.println(number + "! = " + factorialRecursive(number));}
}

在這里插入圖片描述

2.2.2 迭代實現

public class Factorial {// 迭代方法計算階乘public static int factorialIterative(int n) {if (n < 0) {throw new IllegalArgumentException("Number must be non-negative.");}int result = 1;for (int i = 2; i <= n; i++) {result *= i;}return result;}public static void main(String[] args) {// 測試階乘函數int number = 5;  // 你可以更改這個值來測試不同的輸入try {System.out.println(number + "! = " + factorialIterative(number));} catch (IllegalArgumentException e) {System.out.println(e.getMessage());}}
}

在這里插入圖片描述

2.2.3 性能對比

在這里插入圖片描述
在這里插入圖片描述

💡貼士:可以看出遞歸和迭代實現的效果一樣,區別在遞歸會使用多次重復計算,比如計算5的階乘會計算4的階乘一直到1的階乘,然后又從1的階乘一個一個疊加上去,相當于走了一個來回,增加了很多開銷。

三、優雅的遞歸理解

如果看到這里還沒有理解遞歸的思想或者無法使用遞歸處理問題,那么接下來不要眨眼睛,見證奇跡的時刻就要到了。

👉👉👉 所有的遞歸思想都可以轉化成nn-1的狀態關系。

三步走思想:

  1. 參數(和n有關)。
  2. 臨界條件(數學歸納法中臨界條件,這個是最遠的狀態,一般是當n = 1時的狀態值)。
  3. 計算fn的公式。

3.1 階乘計算分解

遞歸思想:
階乘問題是最好理解的,可以直接分解成f(n) = f(n-1) * n 。那么給定方法
在這里插入圖片描述

3.2 DFS分解

在這里插入圖片描述

💡貼士:所有的遞歸問題都可以換成fnfn-1…之間的關系,只不過像DFS這種不是計算的具體的值,而是用的處理操作。需要仔細體會一下fnfn-1之間的關系。

四、尾遞歸優化(Tail Call Optimization, TCO)

4.1 尾遞歸優化概念

尾遞歸優化(Tail Call Optimization, TCO)是一種編譯器或解釋器優化技術,旨在優化尾遞歸調用,使其不會增加額外的棧幀。這意味著在某些情況下,尾遞歸可以被轉換為等效的迭代代碼,從而避免了棧溢出的風險并提高了性能。

尾遞歸是指一個函數在其執行的最后一步調用自身,并且這個遞歸調用是函數返回值的一部分。換句話說,如果遞歸調用是函數的最后一個操作,那么它就是一個尾遞歸調用。

在Java中,標準的JVM并不直接支持尾遞歸優化(Tail Call Optimization, TCO)。這意味著即使你的函數是尾遞歸的,JVM也不會自動將其優化為迭代形式。然而,你可以通過手動將尾遞歸轉換為迭代來避免棧溢出問題。

4.2 尾遞歸優化演示

盡管如此,理解如何編寫尾遞歸函數以及如何手動進行優化是非常有用的。下面我們將展示一個尾遞歸的階乘函數示例,并討論如何手動將其轉換為迭代形式。

public class Factorial {// 尾遞歸方法計算階乘public static long factorialTailRecursive(long n, long accumulator) {if (n == 0) {return accumulator;} else {return factorialTailRecursive(n - 1, n * accumulator);}}public static void main(String[] args) {// 測試階乘函數long number = 5;  // 你可以更改這個值來測試不同的輸入System.out.println(number + "! = " + factorialTailRecursive(number, 1));}
}

在這個例子中,factorialTailRecursive 函數使用了一個累積器 accumulator 來存儲中間結果。每次遞歸調用時,它都會更新 n 和 accumulator 的值,直到達到基準情況(n == 0)。
由于Java不支持尾遞歸優化,我們可以手動將上述尾遞歸函數轉換為等效的迭代形式:

public class Factorial {// 迭代方法計算階乘public static long factorialIterative(long n) {long result = 1;for (long i = 2; i <= n; i++) {result *= i;}return result;}public static void main(String[] args) {// 測試階乘函數long number = 5;  // 你可以更改這個值來測試不同的輸入System.out.println(number + "! = " + factorialIterative(number));}
}

雖然Java本身不支持尾遞歸優化,但可以通過使用輔助類或數據結構來模擬這種行為。以下是一個示例,展示了如何使用一個簡單的棧來模擬尾遞歸優化:
在這里插入圖片描述

import java.util.ArrayDeque;
import java.util.Deque;public class Factorial {// 輔助類用于模擬尾遞歸private static class FactorialTask {long n;long accumulator;FactorialTask(long n, long accumulator) {this.n = n;this.accumulator = accumulator;}}// 模擬尾遞歸優化的方法public static long factorialSimulatedTCO(long n) {Deque<FactorialTask> stack = new ArrayDeque<>();stack.push(new FactorialTask(n, 1));while (!stack.isEmpty()) {FactorialTask task = stack.pop();if (task.n == 0) {continue;} else if (task.n == 1) {return task.accumulator;} else {stack.push(new FactorialTask(task.n - 1, task.n * task.accumulator));}}return 1; // 基準情況}public static void main(String[] args) {// 測試階乘函數long number = 5;  // 你可以更改這個值來測試不同的輸入System.out.println(number + "! = " + factorialSimulatedTCO(number));}
}

💡貼士:
盡管Java不支持尾遞歸優化,但我們可以通過以下幾種方式來處理這個問題:
👉手動轉換為迭代:將尾遞歸函數轉換為等效的迭代形式。
👉使用輔助類模擬:利用棧或其他數據結構來模擬尾遞歸的過程,從而避免棧溢出。

五、哪些問題更適合遞歸解決

1. 數學問題

階乘計算:計算一個數的階乘是一個經典的遞歸問題。

斐波那契數列:斐波那契數列中的每一項是前兩項之和,非常適合用遞歸來實現。

最大公約數(GCD):歐幾里得算法通過遞歸方式求解兩個數的最大公約數。

2. 分治算法

歸并排序:將數組分成兩半,分別對每一半進行排序,然后合并結果。

快速排序:選擇一個基準元素,將數組分為比基準大和比基準小的兩部分,分別對這兩部分進行排序。

二分查找:在一個有序數組中查找某個值,每次將搜索范圍縮小一半。

3. 樹形結構遍歷

二叉樹遍歷:包括前序遍歷、中序遍歷和后序遍歷等。

多叉樹遍歷:對于任意深度的多叉樹,遞歸遍歷是一種直觀且高效的解決方案。

圖的深度優先搜索(DFS):遞歸地訪問每個相鄰節點,直到所有節點都被訪問過。

4. 回溯算法

八皇后問題:找到所有可以在棋盤上放置八個皇后而不互相攻擊的方案。

迷宮問題:從起點開始,嘗試每一條可能的路徑,直到找到出口或所有路徑都已嘗試完畢。

組合和排列問題:生成一組元素的所有可能組合或排列。

5. 動態規劃問題

雖然動態規劃問題通常可以通過迭代來解決,但在某些情況下,遞歸結合記憶化(Memoization)可以簡化問題的解決過程:

背包問題:給定一組物品,每個物品有一個重量和一個價值,在限定總重量的前提下,如何選擇物品使得總價值最大。
最長公共子序列(LCS):找到兩個序列的最長公共子序列。

6. 解析嵌套結構

解析表達式樹:例如,解析算術表達式時,可以將其表示為一棵樹,并通過遞歸方式對其進行求值。

解析JSON/XML數據:這些數據格式通常包含嵌套的對象和數組,遞歸方法可以方便地處理這種嵌套結構。

7. 遞歸關系明確的問題

漢諾塔問題:經典的遞歸問題,涉及將一系列盤子從一個柱子移動到另一個柱子。

字符串操作:例如,反轉字符串、檢查回文等,這些問題往往可以通過遞歸方式進行簡單而直觀的實現。

獻給讀者


💯 計算機技術的世界浩瀚無垠,充滿了無限的可能性和挑戰,它不僅是代碼與算法的交織,更是夢想與現實的橋梁。無論前方的道路多么崎嶇不平,希望你始終能保持那份初心,專注于技術的探索與創新,用每一次的努力和進步書寫屬于自己的輝煌篇章。

🏰在這個快速發展的數字時代,愿我們都能成為推動科技前行的中堅力量,不忘為何出發,牢記心中那份對技術執著追求的熱情。繼續前行吧,未來屬于那些為之努力奮斗的人們。


親,碼字不易,動動小手,歡迎 點贊 ? 收藏,如 🈶 問題請留言(評論),博主看見后一定及時給您答復,💌💌💌


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73273.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73273.shtml

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

相關文章

Android 系統進程啟動Activity方法說明

前面文章Android Activity的啟動器ActivityStarter入口說到Activity的恢復執行是由 mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch)來實現的&#xff0c;下面就看下它的實現。 RootWindowContainer類的…

PostgreSQL_安裝

目錄 前置&#xff1a; 安裝過程&#xff1a; 1 下載軟件 2 創建安裝文件夾和放置數據的文件夾 3 雙擊安裝 4 連接服務 前置&#xff1a; PostgreSQL 15 windows 10 專業版 安裝過程&#xff1a; 1 下載軟件 PostgreSQL: Downloads 大小326MB 2 創建安裝文件夾和放…

docker desktop 集成WSL Ubuntu22.04

Windows docker desktop 設置WSL ubuntu 22.04啟用與其他發行版的集成 Windows docker desktop 安裝參考 wsl ubuntu 22.04 查看我宿主機的docker desktop 容器全部的信息 wsl -d Ubuntu-22.04 -u root

從國家能源到浙江交通投資,全息技術在能源交通領域的創新應用

一、3D全息技術行業應用參數及設計制作要求 全息投影 全息投影技術通過激光器、全息片等設備&#xff0c;將物體的三維信息記錄下來&#xff0c;并在特定條件下再現。應用參數包括投影距離、投影面積、投影亮度等。設計制作要求&#xff1a;高清晰度、高亮度、低噪音、穩定性好…

新能源汽車充換站如何實現光儲充一體化管理?

長三角某換電站光伏板曬到發燙&#xff0c;卻因電網限電被迫切機&#xff1b;北京五環充電站每月多繳6萬超容費&#xff1b;深圳物流車充電高峰排隊3小時...當95%的充換站深陷“用不起綠電、扛不住擴容、算不清碳賬”困局&#xff0c;安科瑞用一組真實數據撕開行業潛規則&#…

二手Mac驗機過程

1.1 外觀檢查 螺絲是否擰過螺絲 1.2 關于本機中 序列號&#xff0c;盒子序列號&#xff0c;機器背部 核對參數 https://checkcoverage.apple.com/coverage 1.3 檢查apple ID與查找 1 登出 iCloud、iTunes、FaceTime、iMessage 在 Mac 上打開「訊息」應用程式&#xff0c;從上方…

C語言-狀態模式詳解與實踐 - OTA升級狀態機

文章目錄 C語言狀態模式詳解與實踐 - OTA升級狀態機1. 什么是狀態模式&#xff1f;2. 為什么需要狀態模式&#xff1f;3. 實際應用場景4. 代碼實現4.1 UML 關系圖4.2 頭文件 (ota_state.h)4.3 實現文件 (ota_state.c)4.4 使用示例 (main.c) 5. 代碼分析5.1 關鍵設計點5.2 實現特…

數據結構5(初):續寫排序

目錄 1、外排序 2、計數排序 1、外排序 上一節中提到的排序都可以用來進行內排序&#xff0c;但是只有歸并排序的思想可以用來進行外部排序&#xff0c;因為文件數據是沒辦法像數組那樣進行訪問的。 例如&#xff1a; #include <stdio.h> #include <assert.h> …

《當人工智能遇上廣域網:跨越地理距離的通信變革》

在數字化時代&#xff0c;廣域網作為連接全球信息的紐帶&#xff0c;讓數據能夠在不同地區的網絡之間流動。然而&#xff0c;地理距離給廣域網數據傳輸帶來諸多挑戰&#xff0c;如高延遲、低帶寬、信號衰減和不穩定等問題。幸運的是&#xff0c;飛速發展的人工智能技術為解決這…

Linux馮諾依曼體系與計算機系統架構認知(8)

文章目錄 前言一、馮諾依曼體系馮?諾依曼體系結構推導內存提高馮?諾依曼體系結構效率的方法你用QQ和朋友聊天時數據的流動過程與馮?諾依曼體系結構相關的一些知識 二、計算機層次結構分析操作系統(Operator System)驅動層的作用與意義系統調用接口(system call)用戶操作接口…

OpenCV的基本用法全解析

《小白入門&#xff1a;OpenCV的基本用法全解析》 嗨&#xff0c;朋友們&#xff01;之前咱們知道了OpenCV在機器視覺里就像個超級厲害的瑞士軍刀&#xff0c;那今天咱們就來好好嘮嘮&#xff0c;**OpenCV到底該怎么用呢&#xff1f;**這就像是拿到了一把好劍&#xff0c;咱們…

匯川EASY系列之以太網通訊(MODBUS_TCP做從站)

匯川easy系列PLC做MODBUS_TCP從站,不需要任何操作,但是有一些需要知道的東西。具體如下: 1、匯川easy系列PLC做MODBUS_TCP從站,,ModbusTCP服務器默認開啟,無需設置通信協議(即不需要配置),端口號為“502”。ModbusTCP從站最多支持31個ModbusTCP客戶端(ModbusTCP主站…

在 Offset Explorer 中配置多節點 Kafka 集群的詳細指南

一、是否需要配置 Zookeeper&#xff1f; Kafka 集群的 Zookeeper 依賴性與版本及運行模式相關&#xff1a; Kafka 版本是否需要 Zookeeper說明0.11.x 及更早版本? 必須配置Kafka 完全依賴 Zookeeper 管理元數據2.8 及以下版本? 必須配置Kafka 依賴外置或內置的 Zookeeper …

前端-選中pdf中的文字并使用,顯示一個懸浮的翻譯按鈕(本地pdfjs+iframe)不適用textlayer

使用pdfjs移步– vue2使用pdfjs-dist實現pdf預覽&#xff08;iframe形式&#xff0c;不修改pdfjs原來的ui和控件&#xff0c;dom層可以用display去掉一部分組件&#xff09; 方案1&#xff1a;獲取選擇文本內容的最前面的字符坐標的位置&#xff08;這種寫法會導致如果選擇超出…

生活電子常識-deepseek-r1本地化部署+ui界面搭建

前言 deepseek-r1 14b模型&#xff0c;32b模型部署在本地電腦上也能實現非常好的性能。 因此有興趣研究了下如何在本地部署。 同時最新流行mauns工作流&#xff0c;他們提供一句話實現網頁端任意應用的能力。實際上&#xff0c;你也可以用本地的模型來實現離線的ai工作流功能。…

mac絲滑安裝Windows操作系統【絲滑簡單免費】

mac絲滑安裝Windows操作系統【絲滑&簡單&免費】 記錄mac絲滑安裝windows系統1、安裝免費版 VMware fusion 132、安裝Windows鏡像文件3、跳過聯網安裝&#xff08;完成1后將2拖入1 點點點 即可來到3的環節&#xff09;4、 安裝vmware 工具【非常重要&#xff0c;涉及聯網…

基于Spring Boot的企業內管信息化系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Pytorch實現之對稱卷積神經網絡結構實現超分辨率

簡介 簡介:針對傳統的超分辨率重建技術所重建的圖像過于光滑且缺乏細節的問題,作者提出了一種改進的生成對抗圖像超分辨率網絡。 該改進方法基于深度神經網絡,其生成模型包含多層卷積模塊和多層反卷積模塊,其中在感知損失基礎上增加了跳層連接和損失函數。 該判別模型由多…

Scikit-learn模型構建全流程解析:從數據預處理到超參數調優

模型選擇與訓練步驟及示例 1. 數據準備與探索 步驟說明&#xff1a;加載數據并初步探索其分布、缺失值、異常值等。 注意事項&#xff1a; 檢查數據類型&#xff08;數值/類別&#xff09;、缺失值和異常值。對類別型特征進行編碼&#xff08;如獨熱編碼&#xff09;。 實例&…

001-JMeter的安裝與配置

1.前期準備 下載好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下載好JDK : :Java Downloads | Oracle 中國 下載圖中圈藍的JMeter和JDK就行&#xff0c;讓它邊下載&#xff0c;我們邊往下看 2.為什么要下載并安裝JDK ? JMeter 是基于 Java 開發的工具&#…