
??前言
方法重載和遞歸是編程中常見且重要的概念,它們?yōu)槲覀兘鉀Q問題提供了靈活且高效的方式。方法重載讓我們可以根據(jù)不同的參數(shù)類型來定義同名方法,使代碼更具可讀性和靈活性;而遞歸則是一種強大的解決復雜問題的方法,通過將問題分解為子問題并逐步解決,展現(xiàn)出了獨特的魅力和實用性。讓我們一起深入探討這兩個主題,探索它們的內(nèi)涵和應(yīng)用。
一、方法重載
1.1 為什么要有方法重載
假設(shè)現(xiàn)在我們需要求兩個數(shù)的和,要求根據(jù)數(shù)據(jù)的類型返回相應(yīng)的返回值。那么就需要寫一個整數(shù)和的方法、一個浮點數(shù)和的方法。如果類似的要求很多,你取名字都是一件極其麻煩的事情,這里就需要用到方法的重載了。
1.2 方法重載的概念與使用
在自然語言中,經(jīng)常會出現(xiàn)“一詞多義”的現(xiàn)象,比如:“好人”。
在編程語言中,一個詞語如果有多重含義,那么就說該詞語被重載了,具體代表什么含義需要結(jié)合具體的場景。
在Java中方法也是可以重載的。如果多個方法的名字相同,參數(shù)列表不同,則稱該幾種方法被重載了。
public static void print(int a,int b) {
System.out.println(a+b);
}
public static void print(float a,float b) {
System.out.println(a+b);
}
public static void print(float a,float b,float c) {
System.out.println(a+b+c);
}
public static void main(String[] args) {
int a = 10;
int b = 20;
print(a,b);
float c = 3.14f;
float d = 5.5f;
float e = 8.8f;
print(c,d);
print(c,d,e);
}
注意事項:
- 方法名必須相同
- 參數(shù)列表必須不同(參數(shù)的個數(shù)不同、參數(shù)的類型不同、類型的次序必須不同)
- 與返回值類型是否相同無關(guān)
- 編譯器在編譯代碼時,會對實參類型進行推演,根據(jù)推演的結(jié)果來確定調(diào)用哪個方法
1.3 方法簽名
在同一個作用域中不能定義兩個相同名稱的標識符。比如:方法中不能定義兩個名字一樣的變量,那為什么類中就可以定義方法名相同的方法呢?
方法簽名即:經(jīng)過編譯器編譯修改過之后方法最終的名字。具體方式:方法全路徑名+參數(shù)列表+返回值類型,構(gòu)成方法完整的名字。
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);
}
}
上述代碼經(jīng)過編譯之后,然后使用JDK自帶的javap反匯編工具查看
具體操作:
- 先對工程進行編譯生成.class字節(jié)碼文件
- 在控制臺中進入到要查看的.class所在的目錄
- 輸入:javap -v 字節(jié)碼文件名字即可
方法簽名中的一些特殊符號說明:
特殊字符 | 數(shù)據(jù)類型 |
---|---|
V | void |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
[ | 數(shù)組(以[開頭,配合其他的特殊字符,表述對應(yīng)數(shù)據(jù)類型的數(shù)組,幾個[表述幾維數(shù)組) |
L | 引用類型,以L開頭,以;結(jié)尾,中間是引用類型的全類名 |
二、遞歸
2.1 開篇小故事
從前有坐山,山上有座廟,廟里有個老和尚給小和尚將故事,講的就是:"從前有座山,山上有座廟,廟里有個老和尚給小和尚講故事,講的就是:“從前有座山,山上有座廟…”“從前有座山……”
上面的這個故事有個特征:
? 自身中又包含了自己,該種思想在數(shù)學和編程中非常有用,因為有些時候,我們遇到的問題直接并不好解決,但是發(fā)現(xiàn)將原問題拆分成其子問題之后,子問題與原問題有相同的解法,等子問題解決之后,原問題就迎刃而解了。
2.2 遞歸的概念
一個方法在執(zhí)行過程中調(diào)用自身, 就稱為 “遞歸”.遞歸相當于數(shù)學上的 “數(shù)學歸納法”, 有一個起始條件, 然后有一個遞推公式.
例如, 我們求 N!
- 起始條件: N = 1 的時候, N! 為 1. 這個起始條件相當于遞歸的結(jié)束條件
- 遞歸公式: 求 N! , 直接不好求, 可以把問題轉(zhuǎn)換成 N! => N * (N-1)!
2.3 遞歸的必要條件
- 將原問題劃分成其子問題,注意:子問題必須要與原問題的解法相同
- 遞歸出口
2.4 代碼示例
遞歸求 N 的階乘
public static int facTow(int n) {
if(n == 1) {
return 1;
}
return n * facTow(n-1);
}
public static void main(String[] args) {
int a= 5;
int ret = facTow(a);
System.out.println(ret);
}
上述代碼就運用到了遞歸,本質(zhì)上就是自己調(diào)用自己,這里必須要有停止的條件,不然就會陷入死遞歸。
2.5 遞歸的執(zhí)行流程剖析
遞歸的程序的執(zhí)行過程不太容易理解, 要想理解清楚遞歸, 必須先理解清楚 “方法的執(zhí)行過程”, 尤其是 “方法執(zhí)行結(jié)束之后, 回到調(diào)用位置繼續(xù)往下執(zhí)行”
public static int facThree(int n) {
System.out.println("方法開始="+n);
if(n == 1) {
System.out.println("方法結(jié)束:n = 1,ret = 1");
return 1;
}
int ret = n * facThree(n-1);
System.out.println("方法結(jié)束"+" n = "+n+" ret = "+ret);
return ret;
}
public static void main(String[] args) {
int a= 5;
int ret = facThree(a);
System.out.println(ret);
}
關(guān)于 “調(diào)用?!?/strong>
- 方法調(diào)用的時候, 會有一個 “?!?這樣的內(nèi)存空間描述當前的調(diào)用關(guān)系. 稱為調(diào)用棧.
- 每一次的方法調(diào)用就稱為一個 “棧幀”, 每個棧幀中包含了這次調(diào)用的參數(shù)是哪些, 返回到哪里繼續(xù)執(zhí)行等信息.
擴展:
遞歸中有一些十分經(jīng)典的問題:斐波那契數(shù)列、青蛙跳臺階、漢諾塔…感興趣的小伙伴可以自行了解哦,后期也是會出一些這種的解題思路和方法,敬請期待!文章來源:http://www.zghlxwxcb.cn/news/detail-852502.html
時候, 會有一個 “棧” 這樣的內(nèi)存空間描述當前的調(diào)用關(guān)系. 稱為調(diào)用棧.
2. 每一次的方法調(diào)用就稱為一個 “棧幀”, 每個棧幀中包含了這次調(diào)用的參數(shù)是哪些, 返回到哪里繼續(xù)執(zhí)行等信息.
擴展:
遞歸中有一些十分經(jīng)典的問題:斐波那契數(shù)列、青蛙跳臺階、漢諾塔…感興趣的小伙伴可以自行了解哦,后期也是會出一些這種的解題思路和方法,敬請期待!
文章來源地址http://www.zghlxwxcb.cn/news/detail-852502.html
到了這里,關(guān)于【Java探索之旅】方法重載 遞歸的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!