Java方法遞歸與輸入輸出深入探索
【前言】
在Java編程的廣闊領(lǐng)域中,方法遞歸和輸入輸出(I/O)是兩個極為重要的概念。方法遞歸為解決特定類型的問題提供了一種優(yōu)雅且高效的思路;而輸入輸出則是Java程序與外部世界交互的橋梁,無論是讀取文件數(shù)據(jù),還是向控制臺輸出信息,都離不開I/O操作。深入理解并熟練運用這兩者,對于提升Java編程能力至關(guān)重要。
一、方法遞歸
1.什么是遞歸
我們小時候應(yīng)該都聽過這樣一個故事,“從前有座山,山上有座廟,廟里有個老和尚講故事,講的是:“從前有座山,山上有座廟,廟里有個老和尚講故事,講的是:“從前有座山,山上有座廟,廟里有個老和尚講故事…
這個故事就很好的體現(xiàn)出了遞歸,它有一個特征:自身中又包含了自己這種思想在編程和數(shù)學中非常有用
so:
遞歸是指在一個方法內(nèi)部調(diào)用自身的過程。它基于一個簡單而強大的概念:將一個復雜的問題分解為一個或多個與原問題相似但規(guī)模更小的子問題,當子問題小到可以直接解決時,遞歸就會停止。
遞歸的必要條件:
- 將原問題分解成其子問題(子問題必須與原問題解法相同)
- 遞歸出口(結(jié)束條件,也就是其實條件)
2. 代碼示例
遞歸求N的階乘
public class Test { public static int fac(int N){ if(N == 1){ return 1; } int ret = N * fac(N-1);//調(diào)用自身 return ret; } public static void main(String[] args) { int ret = fac(5); System.out.println(ret); } }
執(zhí)行結(jié)果:
3.遞歸的執(zhí)行過程
遞歸的程序執(zhí)行過程還是比較復雜的,我們要先理解方法的執(zhí)行過程,尤其是方法執(zhí)行結(jié)束后,回到調(diào)用位置繼續(xù)執(zhí)行
計算5的階乘,fac(5) 會調(diào)用發(fā)出fac(4) , fac(4) 又會調(diào)用fac(3) ,以此類推…直到fac(1)。然后從fac(1) 開始返回結(jié)果,逐步計算出fac(5)的值,這個過程在Java虛擬機的調(diào)用棧(方法調(diào)用時,會有一個“棧”這樣的內(nèi)存空間描述當前的調(diào)用關(guān)系,稱為調(diào)用棧)中進行,每一次遞歸調(diào)用都會在調(diào)用棧中壓入一個新的棧幀,包含這次調(diào)用的參數(shù)和局部變量等,當遞歸返回時,相應(yīng)的棧幀從調(diào)用棧中彈出。
這個圖片可以幫助我們更好的理解
4.遞歸的優(yōu)缺點
- 優(yōu)點在于代碼簡潔、優(yōu)雅,符合人類對問題的分解思考方式,對于某些問題如樹形結(jié)構(gòu)遍歷,遞歸實現(xiàn)非常直觀。
- 由于遞歸調(diào)用會消耗??臻g,對于規(guī)模較大的問題,可能導致棧溢出錯誤。此外,遞歸方法的執(zhí)行效率相對較低,因為每次調(diào)用都伴隨著方法調(diào)用開銷和棧操作。
5.遞歸使用實例
- 按順序打印?個數(shù)字的每?位
public class Test { public static void main(String[] args) { print(2025); } public static void print(int n) { if (n <= 9) { System.out.println(n); } else { print(n / 10); System.out.println(n % 10); } } }
執(zhí)行結(jié)果:
2.遞歸求 1 + 2 + 3 + … + 10
public class Test { public static void main(String[] args) { int ret = sum(10); System.out.println(ret); } public static int sum(int n){ if(n == 1){ return 1; } int ret = n+sum(n-1); return ret; } }
執(zhí)行結(jié)果:
3.求斐波那契數(shù)列的第 N 項
斐波那契數(shù)列的定義是:從第三項開始,每一項都等于前兩項之和。該數(shù)列的前兩項通常定義為0和1,即F(0)=0,F(xiàn)(1)=1,那么后續(xù)的項依次為:F(n)=F(n- 1)+F(n - 2)(n\geq2,n為整數(shù))。所以這個數(shù)列的前幾項就是0,1,1,2,3,5,8,13,21,34…
public class Test { public static void main(String[] args) { int tmp = fib(6);//第6項 System.out.println(tmp); } public static int fib(int n){ if(n == 1 || n == 2){ return 1; } int ret = fib(n-1)+fib(n-2); return ret; } }
執(zhí)行結(jié)果:
二、Java中的輸入輸出
1.輸出
1.1 基本語法
System.out.println(msg);//輸出字符串,換行 System.out.print(msg);//不換行 System.out.printf(format, msg);//格式化輸出
- print 后面帶\n 就換行
- 與C語言基本一致
- 快捷鍵:輸入sout 回車
1.2 格式化字符串
2.輸入
2.1 鍵盤輸入的四個步驟:
導包
import java.util.Scanner;- 創(chuàng)建Scanner 類型對象:
Scanner scan = new Scanner(System.in);- 調(diào)用Scanner類的相關(guān)方法:(nextInt)/(nextFloat)…
- 調(diào)用關(guān)閉方法:scan.close()
2.2 怎么導包
輸入要使用Scanner
讀取字符串,整型,浮點數(shù),(Scanner就是一個工具)但使用Scanner需要導入java.util.Scanner
包
import java.util.Scanner;
頁面頂部就會出現(xiàn)這一句,這樣就完成導包了
2.3 示例
1.輸入一個數(shù),并打印
public class Test { public static void main(String[] args) { // = 對象——>System.in 標準輸入 Scanner scan = new Scanner(System.in); int a = scan.nextInt();//輸入 System.out.println(a); } }
執(zhí)行結(jié)果:
2.打印姓名/年齡/身高/體重
public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入你的姓名:"); String name = sc.nextLine(); System.out.println(name); System.out.println("請輸入你的年齡:"); int age = sc.nextInt(); System.out.println(age); System.out.println("請輸入你的身高:"); float h = sc.nextFloat(); System.out.println(h); System.out.println("請輸入你的體重:"); float w = sc.nextFloat(); System.out.println(w); sc.close(); } }
執(zhí)行結(jié)果:
2.4 多組輸入
循環(huán)讀取
public class Test { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextInt()){ int n = scanner.nextInt(); System.out.println(n); } } }
執(zhí)行結(jié)果:
注意:
- 當循環(huán)輸?多個數(shù)據(jù)的時候, 使?== ctrl + z 來結(jié)束輸?,IDEA中使用ctrl + d==
- Scanner 常??法參考幫助?冊
【總結(jié)】
Java方法遞歸提供了一種獨特的問題解決思路,適用于具有遞歸結(jié)構(gòu)的問題,但使用時需注意棧溢出和性能問題。Java輸入輸出流體系為程序與外部世界交互提供了強大而靈活的工具,熟練掌握這兩個重要的Java特性,將使開發(fā)者在處理各種編程任務(wù)時更加得心應(yīng)手。
到此這篇關(guān)于Java方法遞歸與輸入輸出的文章就介紹到這了,更多相關(guān)Java方法遞歸與輸入輸出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 2.x中Actuator的一些知識點
這篇文章主要給大家介紹了關(guān)于Spring Boot 2.x中Actuator的一些知識點,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot 2.x具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09SpringCloud實戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
服務(wù)網(wǎng)關(guān)是分布式架構(gòu)中不可缺少的組成部分,是外部網(wǎng)絡(luò)和內(nèi)部服務(wù)之間的屏障。這篇文章主要介紹了SpringCloud實戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)。一起跟隨小編過來看看吧2018-05-05使用自定義注解+springAop實現(xiàn)參數(shù)非空校驗方式
這篇文章主要介紹了使用自定義注解+springAop實現(xiàn)參數(shù)非空校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09解決Request.getParameter獲取不到特殊字符bug問題
這篇文章主要介紹了解決Request.getParameter獲取不到特殊字符bug問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot 整合 dubbo xml實現(xiàn)代碼示例
這篇文章主要介紹了SpringBoot 整合 dubbo xml實現(xiàn)代碼示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Spring下token過期時間分平臺(web和app)設(shè)置方法
本文詳細介紹了在Spring環(huán)境下,針對web端和APP端實現(xiàn)不同token過期時間的方法,通過整合SpringBoot、springSecurity和JWT框架,文章講解了登錄流程、JWT的基本組成以及token鑒權(quán)的核心步驟,需要的朋友可以參考下2024-10-10關(guān)于maven環(huán)境的安裝及maven集成idea環(huán)境的問題
Maven 是一個基于 Java 的工具,所以要做的第一件事情就是安裝 JDK。本文重點給大家介紹關(guān)于maven環(huán)境的安裝及和idea環(huán)境的集成問題,感興趣的朋友一起看看吧2021-09-09