Java中的遞歸詳解(用遞歸實(shí)現(xiàn)99乘法表來講解)
1:普通實(shí)現(xiàn)99乘法表太簡(jiǎn)單,是個(gè)程序員都會(huì),實(shí)現(xiàn)如下:
package test.ms;
public class Test99 {
public static void main(String[] args) {
for(int i=1; i<=9;i++){
for(int j=1; j<=i; j++){
System.out.print(j+" * "+i+ " = "+(i*j) +" ");
}
System.out.println();
}
}
}
2:用遞歸方式實(shí)現(xiàn) 99乘法表
代碼如下:
package test.ms;
public class MultiTable {
public static void main(String args[]) {
m(9);
}
/**
* 打印出九九乘法表
* @param i
*/
public static void m(int i) {
if (i == 1) {
System.out.println("1*1=1 ");
} else {
m(i - 1);
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + j * i + " ");
}
System.out.println();
}
}
}
遞歸的方式調(diào)用圖示:

每一個(gè)方法的調(diào)用都會(huì)產(chǎn)生一個(gè)棧幀,壓入到方法棧,當(dāng)遞歸調(diào)用的時(shí)候,方法棧中棧幀的圖示和上圖類似。
去掉方法中棧幀的引用關(guān)系更加直觀:如下圖所示:

簡(jiǎn)化掉相應(yīng)的方法調(diào)用最后執(zhí)行情況如上圖所示,注意 i 一直在變 j每次都是從1開始 然后遞增到和i相等。
這樣上圖依次出棧后就得到了 99 乘法表:
總結(jié):
嵌套for循環(huán) 和 用遞歸實(shí)現(xiàn) 的比較:
棧 主要是用來存放棧幀的,每執(zhí)行一個(gè)方法就會(huì)出現(xiàn)壓棧操作,所以采用遞歸的時(shí)候產(chǎn)生的棧幀比較多,遞歸就會(huì)影響到內(nèi)存,非常消耗內(nèi)存,而使用for循環(huán)就執(zhí)行了一個(gè)方法,壓入棧幀一次,只存在一個(gè)棧幀,所以比較節(jié)省內(nèi)存。
歡迎狠狠的拍磚。直到砸暈。
相關(guān)文章
SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼
這篇文章主要介紹了SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼,主要包括hibernate攔截器的相關(guān)知識(shí),結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
SpringBoot使用JavaMailSender實(shí)現(xiàn)發(fā)送郵件
JavaMailSender是Spring Framework中的一個(gè)接口,用于發(fā)送電子郵件,本文主要為大家詳細(xì)介紹了SpringBoot如何使用JavaMailSender實(shí)現(xiàn)發(fā)送郵件,需要的可以參考下2023-12-12
Spring?Security?過濾器注冊(cè)脈絡(luò)梳理
這篇文章主要介紹了Spring?Security過濾器注冊(cè)脈絡(luò)梳理,Spring?Security在Servlet的過濾鏈中注冊(cè)了一個(gè)過濾器FilterChainProxy,它會(huì)把請(qǐng)求代理到Spring?Security自己維護(hù)的多個(gè)過濾鏈,每個(gè)過濾鏈會(huì)匹配一些URL,如果匹配則執(zhí)行對(duì)應(yīng)的過濾器2022-08-08

