【Java篇】一法不變,萬象歸一:方法封裝與遞歸的思想之道

文章目錄

  • Java 方法的使用:從基礎到遞歸的全面解析
    • 一、方法的概念及使用
      • 1.1 什么是方法 (method)?
      • 1.2 方法定義
      • 1.3 方法調用的執行過程
      • 1.4 實參和形參的關系
      • 1.5 沒有返回值的方法
    • 二、方法重載
      • 2.1 為什么需要方法重載
      • 2.2 方法重載的概念
        • 2.2.4 C++ 和 Java 的比較:
      • 2.3 方法簽名
        • 2.3.1 方法簽名中的一些特殊符號說明
    • 三、遞歸
      • 3.1 生活中的故事
      • 3.2 遞歸的概念
      • 3.3 遞歸執行過程分析
      • 3.4 遞歸練習
        • 3.4.1 示例1:按順序打印一個數字的每一位
        • 3.4.2 示例2:遞歸求 1 + 2 + 3 + ... + 10
        • 3.4.3 示例3:求一個非負整數各位數字之和
        • 3.4.4 示例4:遞歸求斐波那契數列的第 N 項
    • 四、總結與展望

Java 方法的使用:從基礎到遞歸的全面解析

💬 歡迎討論:如果你在閱讀過程中有任何疑問或想要進一步探討的內容,歡迎在評論區留言!我們一起學習、一起成長。

👍 點贊、收藏與分享:如果你覺得這篇文章對你有幫助,記得點贊、收藏并分享給更多想了解 Java 編程的朋友!

🚀 繼續學習之旅:今天,我們將深入探討 Java 中的方法,包括如何定義、調用、重載和遞歸使用方法。這些是每個 Java 程序員必備的技能。


一、方法的概念及使用

1.1 什么是方法 (method)?

方法是組織代碼的一種形式,它允許將重復性代碼封裝在一個單獨的塊中,從而實現模塊化。Java 方法類似于 C 語言中的“函數”。它是解決多次使用相同代碼的理想方式。通過方法,我們不僅可以提高代碼的可重用性,還能提高代碼的可維護性和可讀性。

為什么使用方法:

  1. 減少代碼冗余:當某段功能代碼頻繁出現時,我們可以將它封裝成一個方法,在多個地方調用,避免重復編寫相同的代碼。
  2. 提高代碼的模塊化:代碼分塊后,使得程序結構更加清晰,每個方法可以專注于處理一項任務。
  3. 易于修改與維護:如果某段功能需要修改,我們只需在方法內部修改一次,而不需要修改每個調用該功能的地方。

示例:

假設我們需要開發一個日歷程序,每年都會判斷某個年份是否為閏年,如果每次都寫相同的代碼就顯得非常繁瑣且容易出錯。我們可以將判斷閏年的代碼封裝成一個方法:

public static boolean isLeapYear(int year) {if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {return true;}return false;
}

當需要判斷某個年份是否為閏年時,直接調用該方法即可,而不需要每次都重新寫相同的代碼。

易錯點:

  • 方法的定義與函數的混淆:方法與函數在不同語言中有不同的含義。在 Java 中,所有方法都必須定義在類中,且必須通過類的對象或靜態類名調用,而函數則不依賴于類結構。
  • 沒有方法的好處:如果不使用方法,代碼會變得冗長且難以維護。如果有多個地方需要使用相同代碼,修改時必須在所有地方修改,不利于維護。

1.2 方法定義

方法的定義是編程中的基礎,在 Java 中,每個方法都有特定的語法格式。方法定義的語法如下:

修飾符 返回值類型 方法名稱(參數列表) {方法體代碼;[return 返回值];
}

例子:定義一個判斷閏年的方法

public static boolean isLeapYear(int year) {if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {return true;}return false;
}

解釋:

  1. 修飾符:表示方法的訪問權限和屬性。在這里我們使用 public static,意味著該方法是公有的,可以被外部訪問,并且是靜態的,可以不需要創建對象即可調用。
  2. 返回值類型:方法執行后返回的值的類型。在本例中是 boolean 類型,用來表示是否為閏年(truefalse)。
  3. 方法名稱isLeapYear 是方法的名稱,通常采用小駝峰命名法。
  4. 參數列表:方法的輸入參數,在本例中是一個 int 類型的參數 year,表示要判斷的年份。
  5. 方法體:方法的實現代碼,在本例中用于判斷是否為閏年,并返回結果。

其他注意事項:

  • 方法名必須唯一:同一個類中的方法名稱不能重復,除非參數列表不同(方法重載)。
  • 方法定義不能嵌套:方法定義不能寫在另一個方法內部。

1.3 方法調用的執行過程

方法調用的過程包括以下步驟:

  1. 調用方法:當程序執行到方法調用語句時,控制流轉到該方法,并開始執行該方法中的代碼。
  2. 傳遞參數:在調用方法時,傳遞的實參值會被賦給方法的形參。這些參數可以是基本數據類型的值,也可以是對象。
  3. 執行方法體:方法體中的語句開始執行,按照代碼順序逐條執行。
  4. 返回值:如果方法有返回值,執行完成后會通過 return 返回計算結果。如果方法的返回類型是 void,則不返回任何值。

示例:調用方法計算兩個整數的和:

public class MethodExample {public static void main(String[] args) {int a = 10;int b = 20;System.out.println("第一次調用方法之前");int result = add(a, b);  // 調用方法System.out.println("第一次調用方法之后");System.out.println("result = " + result);}public static int add(int x, int y) {return x + y;  // 執行方法體}
}

執行過程:

  1. 程序在 main 方法中調用 add(a, b),此時控制轉到 add 方法。
  2. add 方法接收 ab 作為參數,執行相加操作,并返回計算結果。
  3. 返回值 result 被賦值為 30,然后輸出。

易錯點:

  1. 方法調用的順序問題:確保方法調用語句書寫順序正確,否則會導致 null 或錯誤的返回結果。
  2. 傳遞錯誤的參數類型方法的形參與實參的類型要匹配,否則編譯時會報錯。

1.4 實參和形參的關系

在 Java 中,實參(實實際參數)是調用方法時傳遞給方法的參數值,而形參(形式參數)是在方法定義時指定的變量名,用來接收傳遞給方法的實參。

實參與形參的關系:

  • 形參:方法定義時的變量,用于接收實參值。在方法調用時,形參是局部的,僅在方法內部有效。
  • 實參:在調用方法時傳遞的實際值,可以是常量、變量或表達式。

例子:

public class TestMethod {public static void main(String[] args) {int result = fac(5);  // 實參 5 被傳遞給形參 nSystem.out.println(result);  // 輸出階乘結果}public static int fac(int n) {int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;}
}

解釋:

  • 實參5 被傳遞給形參 n
  • 形參nfac 方法的局部變量,接收傳遞過來的實參。

易錯點:

  • 實參與形參類型不匹配:確保方法調用時傳遞的實參類型與方法定義時的形參類型匹配。否則,編譯時會報錯。

1.5 沒有返回值的方法

在 Java 中,如果方法不需要返回值,則可以聲明返回類型為 void,表示該方法不返回任何值。

例子:

public class TestMethod {public static void main(String[] args) {int[] arr = {10, 20};swap(arr);  // 調用沒有返回值的方法System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);  // 輸出交換后的結果}public static void swap(int[] arr) {int tmp = arr[0];arr[0] = arr[1];arr[1] = tmp;  // 交換數組元素}
}

解釋:

  • swap 方法通過 void 返回類型表示沒有返回值。
  • 該方法交換了數組中的兩個元素,直接通過數組的引用修改了數組的值。

易錯點:

  • 返回類型不一致:如果方法聲明了 void 返回類型,必須確保方法內沒有 return 語句嘗試返回值,否則編譯時會出錯。

二、方法重載

2.1 為什么需要方法重載

方法重載是 Java 中的一個非常有用的特性。它允許我們定義多個具有相同方法名,但參數列表不同的方法。在一些情況下,可能會遇到需要多個方法來執行相似任務但參數不同的情況。通過方法重載,我們可以使用相同的方法名來執行不同的操作,避免了為每個不同的情況都起個新方法名。

示例:不同參數類型的相加方法

public static int add(int x, int y) {return x + y;  // 用于加法操作,兩個整數相加
}public static double add(double x, double y) {return x + y;  // 用于加法操作,兩個浮點數相加
}

這里,add 方法重載了兩次:一次接受兩個整數,另一次接受兩個浮點數。雖然它們的操作是相同的(加法),但由于參數的不同,Java 允許使用相同的名稱調用不同版本的 add 方法。

為什么要重載:

  1. 簡化代碼:避免多個方法使用不同的名稱來處理相似的任務,使代碼更簡潔易懂。
  2. 提高可維護性:方法名稱統一,修改和維護更容易。如果參數變化,不需要修改多個方法名稱。
  3. 增強靈活性:能夠處理不同類型和數量的參數,而不需要為每個變種寫不同的代碼。

易錯點:

  • 過度重載:方法重載有時會使代碼變得復雜,尤其是當方法名相同但參數差異較小的時候,可能導致程序員難以理解哪個方法會被調用,尤其是在多次重載的情況下。

2.2 方法重載的概念

方法重載(Method Overloading)是指在同一個類中,多個方法具有相同的名字,但它們的參數列表不同(參數的數量、類型、順序可以不同)。方法重載和方法的返回值類型無關,不能僅僅根據返回類型來區分不同的方法。

方法重載的規則:

  1. 方法名必須相同:所有重載的方法必須使用相同的方法名。
  2. 參數列表必須不同:重載的方法必須有不同的參數列表。可以通過參數的數量、類型或順序來區分。
  3. 返回類型無關:返回類型不能作為重載的方法區分標準。

示例:參數數量不同的重載:

public static int add(int x, int y) {return x + y;
}public static int add(int x, int y, int z) {return x + y + z;
}

在這個例子中,add 方法根據傳入參數的數量不同進行了重載。第一個方法接受兩個整數,第二個方法接受三個整數。


易錯點:

  • 僅根據返回類型重載:方法重載不能僅僅根據返回類型不同來區分。例如,如果兩個方法只有返回類型不同,它們不能被視為重載方法,會導致編譯錯誤。
// 錯誤示例:僅憑返回類型不同無法重載
public static int add(int x, int y) {return x + y;
}public static double add(int x, int y) {  // 編譯錯誤:方法已定義,無法僅憑返回類型重載return x + y;
}
2.2.4 C++ 和 Java 的比較:
  • C++:允許通過 返回類型的不同 來進行方法重載,即使方法的參數完全相同,C++ 編譯器也不會報錯,它會將方法的返回類型作為重載的一部分來區分方法。但這種做法在運行時可能會引發問題,因為編譯器不能根據返回類型來明確選擇調用哪個方法。

  • Java:嚴格要求方法重載必須基于 參數列表的不同,返回類型不能作為重載的依據。如果兩個方法的參數列表相同但返回類型不同,Java 編譯器會在編譯時直接報錯,提示方法沖突。

例子比較:

Java 中的錯誤示例:

public class Test {public static int add(int x, int y) {return x + y;}public static double add(int x, int y) {  // 編譯錯誤:方法已定義,無法僅憑返回類型重載return x + y;}public static void main(String[] args) {System.out.println(add(5, 10));}
}
  • 錯誤解釋:在 Java 中,這會引發編譯錯誤,提示 add(int, int) 方法已經定義,不能僅憑返回類型來重載方法。

C++ 中的示例:

int add(int x, int y) {return x + y;
}double add(int x, int y) {  // C++ 允許通過返回類型不同來重載return x + y;
}int main() {int result1 = add(5, 10);  // 調用第一個方法double result2 = add(5, 10);  // 調用第二個方法cout << result1 << endl;cout << result2 << endl;return 0;
}
  • C++ 行為:C++ 編譯器允許這種返回類型不同的重載,盡管這樣做在實踐中可能會引發混淆,但 C++ 編譯時不會報錯。

總結:

  • Java方法重載必須依據參數列表的差異,而 返回類型不同不會導致重載。這種嚴格的規則有助于提高代碼的可讀性和可維護性,避免調用時的混淆。

  • C++返回類型不同也可作為重載的依據,但這種做法容易造成調用時的歧義,并且不推薦使用。


2.3 方法簽名

在同一個作用域中不能定義兩個相同名稱的方法。比如:方法中不能定義兩個名字符合相同的變量,那么為什么類中就可以定義方法名相同的方法呢?這是因為 方法簽名 是根據方法的 完整路徑名+參數列表+返回類型 來確定的。

具體方式是:方法全路徑名+參數列表+返回類型構成方法完全的名稱。

示例:

public class TestMethod {public static int add(int x, int y) {return x + y;}public static double add(double x, double y) {return x + y;}public static void main(String[] args) {add(1, 2);add(1.5, 2.5);}
}

在上面的代碼中,我們定義了兩個 add 方法,分別接受 intdouble 類型的參數。雖然方法名稱相同,但它們的方法簽名不同,因為它們的 參數類型不同

在這里插入圖片描述

2.3.1 方法簽名中的一些特殊符號說明

在方法簽名中,某些符號代表了不同的數據類型或含義,具體如下:

特殊字符數據類型
Vvoid
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
[數組(以左括號開始,配合其他的特殊字符,表示對應數據類型的數組,幾個[表示幾維數組)
L引用類型(以L開頭,以;結尾,表示引用類型的全類名)

示例說明:

對于方法簽名中的特殊字符:

  • V 表示方法沒有返回值(void)。
  • I 表示 int 類型。
  • D 表示 double 類型。
  • L 表示引用類型,以 L 開頭并以 ; 結尾,例如:Ljava/lang/String; 表示 String 類型。
  • [ 表示數組類型,例如 I[] 表示 int 類型的數組。

通過這些符號,Java 可以精確地標識一個方法。


三、遞歸

3.1 生活中的故事

從前有座山,山上有座廟,廟里有個老和尚給小和尚講故事,故事內容是這樣的:

“從前有座山,山上有座廟,廟里有個老和尚給小和尚講故事,講的就是:
“從前有座山,山上有座廟…”
“從前有座山……””

在這里插入圖片描述

這個故事有個特征:故事中包含了自身。正因為如此,當我們遇到問題時,可以嘗試將大問題拆分為與原問題結構相同的子問題,待子問題解決后,整體問題也就迎刃而解了。


3.2 遞歸的概念

在編程中,遞歸指的是一個方法在執行過程中調用自身。這種思想類似于數學中的“數學歸納法”,通常包含兩個部分:

  • 遞歸出口:例如求階乘時,當 N = 1 時返回 1,這就是遞歸結束的條件。
  • 遞歸公式:將原問題轉換為對較小規模問題的求解,比如 N! 可轉換為 N * (N-1)!。

遞歸的必要條件有:

  1. 子問題與原問題解法一致:將原問題拆分成結構相似的子問題。
  2. 明確的遞歸出口:防止無限遞歸,保證問題最終能求解。

代碼示例:遞歸求 N 的階乘

public static int factor(int n) {if (n == 1) {  // 遞歸出口return 1;}return n * factor(n - 1);  // 遞歸調用自身
}public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);  // 輸出 ret = 120
}

3.3 遞歸執行過程分析

理解遞歸關鍵在于清楚地了解方法的執行過程。當一個方法調用自身時,每次調用都會在調用棧中創建一個新的“棧幀”,保存本次調用的參數和返回地址。方法執行結束后,會依次返回到上層調用位置繼續執行。

代碼示例:帶調用過程打印的階乘求解

public static int factor(int n) {System.out.println("函數開始, n = " + n);if (n == 1) {System.out.println("函數結束, n = 1 ret = 1");return 1;}int ret = n * factor(n - 1);System.out.println("函數結束, n = " + n + " ret = " + ret);return ret;
}public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);
}

執行結果示例:

函數開始, n = 5
函數開始, n = 4
函數開始, n = 3
函數開始, n = 2
函數開始, n = 1
函數結束, n = 1 ret = 1
函數結束, n = 2 ret = 2
函數結束, n = 3 ret = 6
函數結束, n = 4 ret = 24
函數結束, n = 5 ret = 120
ret = 120

在這里插入圖片描述

關于 “調用棧”
方法調用的時候, 會有一個 “棧” 這樣的內存空間描述當前的調用關系. 稱為調用棧.
每一次的方法調用就稱為一個 “棧幀”, 每個棧幀中包含了這次調用的參數是哪些, 返回到哪里繼續執行等信息.
后面我們借助 IDEA 很容易看到調用棧的內容


3.4 遞歸練習

以下是幾個遞歸練習示例,幫助你鞏固遞歸思想:

3.4.1 示例1:按順序打印一個數字的每一位

例如,對于數字 1234,依次打印出 1 2 3 4

public static void print(int num) {if (num > 9) {print(num / 10);}System.out.println(num % 10);
}
3.4.2 示例2:遞歸求 1 + 2 + 3 + … + 10
public static int sumSeries(int n) {if (n == 1) {return 1;}return n + sumSeries(n - 1);
}
3.4.3 示例3:求一個非負整數各位數字之和

例如,輸入 1729,返回 1 + 7 + 2 + 9 = 19。

public static int sumDigits(int num) {if (num < 10) {return num;}return num % 10 + sumDigits(num / 10);
}
3.4.4 示例4:遞歸求斐波那契數列的第 N 項

斐波那契數列介紹
斐波那契數列定義為:

  • fib(1) = 1
  • fib(2) = 1
  • 對于 n > 2,fib(n) = fib(n - 1) + fib(n - 2)

遞歸實現:

public static int fib(int n) {if (n == 1 || n == 2) {return 1;}return fib(n - 1) + fib(n - 2);
}

由于遞歸計算斐波那契數列時存在大量重復運算,當 n 較大時(如 fib(40)),執行速度會非常慢。為此,我們可以采用循環方式優化:

循環實現(優化版):

public static int fibOptimized(int n) {if (n == 1 || n == 2) {return 1;}int last2 = 1;int last1 = 1;int cur = 0;for (int i = 3; i <= n; i++) {cur = last1 + last2;last2 = last1;last1 = cur;}return cur;
}

四、總結與展望

本文詳細介紹了Java方法的基本概念、重載以及遞歸應用,結合實際代碼示例,幫助讀者理解方法在Java編程中的重要作用。我們看到,相較于其他語言,Java通過方法的封裝與重載提供了更高的靈活性和代碼重用性。在遞歸的部分,文章闡述了遞歸實現的原理及其優勢,同時提醒在使用遞歸時要注意棧溢出等問題。掌握這些方法相關的技巧后,讀者將能更高效地編寫清晰、可維護的Java代碼。

未來,我們將繼續探討Java中的其他高級話題,如多線程編程、網絡通信等,幫助讀者進一步提升編程技能。如果你有任何疑問或建議,歡迎在評論區留言,讓我們一起成長、一起進步!


以上就是關于【Java篇】一法不變,萬象歸一:方法封裝與遞歸的思想之道內容啦,各位大佬有什么問題歡迎在評論區指正,或者私信我也是可以的啦,您的支持是我創作的最大動力!??
在這里插入圖片描述

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

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

相關文章

深入理解 HTML 中的<div>和元素:構建網頁結構與樣式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素雖看似普通&#xff0c;卻扮演著極為關鍵的角色。它們就像網頁搭建過程中的萬能積木&#xff0c;能夠將各種 HTML 元素巧妙地組合起來&#xff0c;無論是構建頁面布局&#xff0c;還是對局部內容進行樣式調整&#xff…

《大語言模型》學習筆記(一)

一、什么是大語言模型 大語言模型是指在海量無標注文本數據上進行預訓練得到的大型預訓練語言模型&#xff0c;例如GPT-3&#xff0c;PaLM和LLaMA。大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一種基于深度學習的自然語言處理模型&#xff0c;能…

電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現

以下是電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現方案,涵蓋系統架構、關鍵技術、核心功能及實施路徑,結合典型場景與代碼示例: 一、系統架構設計 采用云-邊-端三層架構,實現分布式能源的高效協同管理: 1. 終端層(感知層) 設備組…

實驗5 邏輯回歸

實驗5 邏輯回歸 【實驗目的】掌握邏輯回歸算法 【實驗內容】處理樣本&#xff0c;使用邏輯回歸算法進行參數估計&#xff0c;并畫出分類邊界 【實驗要求】寫明實驗步驟&#xff0c;必要時補充截圖 1、參照“2.1梯度下降法實現線性邏輯回歸.ipynb”和“2.2 sklearn實現線性邏輯…

思維訓練讓你更高、更強 |【邏輯思維能力】「刷題訓練筆記」假設法模式邏輯訓練題(1-5)

每日一刷 思維訓練讓你更高、更強&#xff01; 題目1 誰在說謊&#xff0c;誰拿走了零錢&#xff1f; 姐姐上街買菜回來后&#xff0c;就隨手把手里的一些零錢放在了抽屜里&#xff0c;可是&#xff0c;等姐姐下午再去拿錢買菜的時候發現抽屜里的零錢沒有了&#xff0c;于是&…

【愚公系列】《高效使用DeepSeek》004-DeepSeek的產品形態和功能詳解

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

用python代碼將excel中的數據批量寫入Json中的某個字段,生成新的Json文件

需求 需求&#xff1a; 1.將execl文件中的A列賦值給json中的TrackId&#xff0c;B列賦值給json中的OId 要求 execl的每一行&#xff0c;對應json中的每一個OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

【Python】dash-fastapi前后端搭建

概述 項目中需要快速搭建一個前后端系統&#xff0c;涉及到dash-fastapi架構的時候&#xff0c;對該架構的時候進行總結。本文主要總結的是對該架構的基本使用&#xff0c;后續再對該架構的項目源碼進行總結分析 此處實現一個小的demo&#xff0c;迷你任務管理器&#xff0c;…

IDEA中鏈接使用mysql數據庫

一、連接mysql 1. 打開idea&#xff0c;在右上角側邊欄有數據庫database插件&#xff0c;打開側邊欄點擊加號->數據源&#xff0c;可以看到支持很多數據庫&#xff0c;選擇mysql。 2. 首次使用需要下載驅動程序&#xff0c;不然連接數據庫會報錯。找到mysql&#xff0c;點擊…

程序編譯生成的文件

目錄 .i 文件 .s 文件 .o文件 總結 在 C 編程中&#xff0c;.i、.s和 .o 文件是編譯過程中生成的不同階段的文件&#xff0c;它們代表不同的含義&#xff1a; .i 文件 全稱 &#xff1a;預處理后的文件&#xff08;Intermediate File&#xff09;。 含義&#xff1a;.i文件…

[S32K]SPI

SpiShiftClockidleLevel: CLK空閑時電平(CPOL)&#xff1b; SpiDataShifrEdge:數據移位邊沿(CPHA)&#xff1b; SpiDataWidth: SpiTransferStart: MSB(高位起始)&#xff0c;LSB(低位起始)&#xff1b;&#xff1b; SpiHwUnit: 這是一個具體的硬件&#xff1f; SpiDataShiftE…

系統思考:客戶價值

“真正的市場競爭&#xff0c;不是比誰更能制造產品&#xff0c;而是比誰更能創造價值。” ——杰夫貝索斯 在組織輔導中&#xff0c;我經常問團隊一個問題&#xff1a;“我們的客戶是誰&#xff1f;”大多數人的第一反應是——“支付費用的就是客戶。” 這在過去的市場擴張階…

ArcGIS Pro 車牌分區數據處理與地圖制作全攻略

在大數據時代&#xff0c;地理信息系統&#xff08;GIS&#xff09;技術在各個領域都有著廣泛的應用&#xff0c;而 ArcGIS Pro 作為一款功能強大的 GIS 軟件&#xff0c;為數據處理和地圖制作提供了豐富的工具和便捷的操作流程。 車牌數據作為一種重要的地理空間數據&#xf…

OpenCV圖像加權函數:addWeighted

1 addWeighted函數 在OpenCV 里&#xff0c;addWeighted 函數的作用是對兩個圖像進行加權求和&#xff0c;常用于圖像融合、圖像過渡等場景。函數如下&#xff1a; cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 參數解釋 src1&#xff1a;第一個輸入圖…

Tcp網絡通信的基本流程梳理

先來一張經典的流程圖 接下介紹一下大概流程&#xff0c;各個函數的參數大家自己去了解加深一下印象 服務端流程 1.創建套接字&#xff1a;使用 socket 函數創建一個套接字&#xff0c;這個套接字后續會被用于監聽客戶端的連接請求。 需要注意的是&#xff0c;服務端一般有倆…

mysql學習-刪除數據(drop、truncate、delete)

1、概述 drop、truncate、delete都可以刪除mysql中的數據&#xff0c;但它們的作用范圍和操作方式有很大的不同。 2、詳細區別 2.1、drop 特點&#xff1a; 1、速度快 2、會刪除表數據&#xff0c;還會刪除表結構&#xff0c;包括與該表相關的所有數據&#xff0c;索引&…

編程自學指南:java程序設計開發,網絡編程基礎,TCP編程,UDP編程,HTTP客戶端開發

編程自學指南&#xff1a;java程序設計開發&#xff0c;網絡編程基礎 學習目標&#xff1a; 理解網絡協議&#xff08;TCP/IP、UDP&#xff09;的核心概念 掌握Socket編程實現客戶端與服務端通信 能夠通過多線程處理并發網絡請求 開發簡單的網絡應用&#xff08;如聊天程序…

leecode797.所有可能的路徑

深度優先搜索 class Solution { private:vector<vector<int>> result;vector<int> temp;void allPathsSourceTarget(vector<vector<int>> &graph,int v){if(vgraph.size()-1)result.push_back(temp);else{for(auto& adjVertex:graph[v]…

第八節:紅黑樹(初階)

【本節要點】 紅黑樹概念紅黑樹性質紅黑樹結點定義紅黑樹結構紅黑樹插入操作的分析 一、紅黑樹的概念與性質 1.1 紅黑樹的概念 紅黑樹 &#xff0c;是一種 二叉搜索樹 &#xff0c;但 在每個結點上增加一個存儲位表示結點的顏色&#xff0c;可以是 Red和 Black 。 通過對 任何…

微信小程序threejs三維開發

微信小程序threejs開發 import * as THREE from three; const { performance, document, window, HTMLCanvasElement, requestAnimationFrame, cancelAnimationFrame, core, Event, Event0 } THREE .DHTML import Stats from three/examples/jsm/libs/stats.module.js; im…