Java方法遞歸與輸入輸出深入探索
【前言】
在Java編程的廣闊領(lǐng)域中,方法遞歸和輸入輸出(I/O)是兩個(gè)極為重要的概念。方法遞歸為解決特定類型的問題提供了一種優(yōu)雅且高效的思路;而輸入輸出則是Java程序與外部世界交互的橋梁,無論是讀取文件數(shù)據(jù),還是向控制臺(tái)輸出信息,都離不開I/O操作。深入理解并熟練運(yùn)用這兩者,對(duì)于提升Java編程能力至關(guān)重要。
一、方法遞歸
1.什么是遞歸
我們小時(shí)候應(yīng)該都聽過這樣一個(gè)故事,“從前有座山,山上有座廟,廟里有個(gè)老和尚講故事,講的是:“從前有座山,山上有座廟,廟里有個(gè)老和尚講故事,講的是:“從前有座山,山上有座廟,廟里有個(gè)老和尚講故事…
這個(gè)故事就很好的體現(xiàn)出了遞歸,它有一個(gè)特征:自身中又包含了自己這種思想在編程和數(shù)學(xué)中非常有用
so:
遞歸是指在一個(gè)方法內(nèi)部調(diào)用自身的過程。它基于一個(gè)簡單而強(qiáng)大的概念:將一個(gè)復(fù)雜的問題分解為一個(gè)或多個(gè)與原問題相似但規(guī)模更小的子問題,當(dāng)子問題小到可以直接解決時(shí),遞歸就會(huì)停止。
遞歸的必要條件:
- 將原問題分解成其子問題(子問題必須與原問題解法相同)
- 遞歸出口(結(jié)束條件,也就是其實(shí)條件)
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í)行過程還是比較復(fù)雜的,我們要先理解方法的執(zhí)行過程,尤其是方法執(zhí)行結(jié)束后,回到調(diào)用位置繼續(xù)執(zhí)行
計(jì)算5的階乘,fac(5) 會(huì)調(diào)用發(fā)出fac(4) , fac(4) 又會(huì)調(diào)用fac(3) ,以此類推…直到fac(1)。然后從fac(1) 開始返回結(jié)果,逐步計(jì)算出fac(5)的值,這個(gè)過程在Java虛擬機(jī)的調(diào)用棧(方法調(diào)用時(shí),會(huì)有一個(gè)“棧”這樣的內(nèi)存空間描述當(dāng)前的調(diào)用關(guān)系,稱為調(diào)用棧)中進(jìn)行,每一次遞歸調(diào)用都會(huì)在調(diào)用棧中壓入一個(gè)新的棧幀,包含這次調(diào)用的參數(shù)和局部變量等,當(dāng)遞歸返回時(shí),相應(yīng)的棧幀從調(diào)用棧中彈出。
這個(gè)圖片可以幫助我們更好的理解

4.遞歸的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)在于代碼簡潔、優(yōu)雅,符合人類對(duì)問題的分解思考方式,對(duì)于某些問題如樹形結(jié)構(gòu)遍歷,遞歸實(shí)現(xiàn)非常直觀。
- 由于遞歸調(diào)用會(huì)消耗??臻g,對(duì)于規(guī)模較大的問題,可能導(dǎo)致棧溢出錯(cuò)誤。此外,遞歸方法的執(zhí)行效率相對(duì)較低,因?yàn)槊看握{(diào)用都伴隨著方法調(diào)用開銷和棧操作。
5.遞歸使用實(shí)例
- 按順序打印?個(gè)數(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 項(xiàng)
斐波那契數(shù)列的定義是:從第三項(xiàng)開始,每一項(xiàng)都等于前兩項(xiàng)之和。該數(shù)列的前兩項(xiàng)通常定義為0和1,即F(0)=0,F(xiàn)(1)=1,那么后續(xù)的項(xiàng)依次為:F(n)=F(n- 1)+F(n - 2)(n\geq2,n為整數(shù))。所以這個(gè)數(shù)列的前幾項(xiàng)就是0,1,1,2,3,5,8,13,21,34…
public class Test {
public static void main(String[] args) {
int tmp = fib(6);//第6項(xiàng)
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 鍵盤輸入的四個(gè)步驟:
導(dǎo)包import java.util.Scanner;- 創(chuàng)建Scanner 類型對(duì)象:
Scanner scan = new Scanner(System.in);- 調(diào)用Scanner類的相關(guān)方法:(nextInt)/(nextFloat)…
- 調(diào)用關(guān)閉方法:scan.close()
2.2 怎么導(dǎo)包
輸入要使用Scanner讀取字符串,整型,浮點(diǎn)數(shù),(Scanner就是一個(gè)工具)但使用Scanner需要導(dǎo)入java.util.Scanner包

import java.util.Scanner;
頁面頂部就會(huì)出現(xiàn)這一句,這樣就完成導(dǎo)包了
2.3 示例
1.輸入一個(gè)數(shù),并打印
public class Test {
public static void main(String[] args) {
// = 對(duì)象——>System.in 標(biāo)準(zhǔn)輸入
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("請(qǐng)輸入你的姓名:");
String name = sc.nextLine();
System.out.println(name);
System.out.println("請(qǐng)輸入你的年齡:");
int age = sc.nextInt();
System.out.println(age);
System.out.println("請(qǐng)輸入你的身高:");
float h = sc.nextFloat();
System.out.println(h);
System.out.println("請(qǐng)輸入你的體重:");
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é)果:

注意:
- 當(dāng)循環(huán)輸?多個(gè)數(shù)據(jù)的時(shí)候, 使?== ctrl + z 來結(jié)束輸?,IDEA中使用ctrl + d==
- Scanner 常??法參考幫助?冊(cè)
【總結(jié)】
Java方法遞歸提供了一種獨(dú)特的問題解決思路,適用于具有遞歸結(jié)構(gòu)的問題,但使用時(shí)需注意棧溢出和性能問題。Java輸入輸出流體系為程序與外部世界交互提供了強(qiáng)大而靈活的工具,熟練掌握這兩個(gè)重要的Java特性,將使開發(fā)者在處理各種編程任務(wù)時(shí)更加得心應(yīng)手。
到此這篇關(guān)于Java方法遞歸與輸入輸出的文章就介紹到這了,更多相關(guān)Java方法遞歸與輸入輸出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 2.x中Actuator的一些知識(shí)點(diǎn)
這篇文章主要給大家介紹了關(guān)于Spring Boot 2.x中Actuator的一些知識(shí)點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot 2.x具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
服務(wù)網(wǎng)關(guān)是分布式架構(gòu)中不可缺少的組成部分,是外部網(wǎng)絡(luò)和內(nèi)部服務(wù)之間的屏障。這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)。一起跟隨小編過來看看吧2018-05-05
使用自定義注解+springAop實(shí)現(xiàn)參數(shù)非空校驗(yàn)方式
這篇文章主要介紹了使用自定義注解+springAop實(shí)現(xiàn)參數(shù)非空校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
解決Request.getParameter獲取不到特殊字符bug問題
這篇文章主要介紹了解決Request.getParameter獲取不到特殊字符bug問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringBoot 整合 dubbo xml實(shí)現(xiàn)代碼示例
這篇文章主要介紹了SpringBoot 整合 dubbo xml實(shí)現(xiàn)代碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
Spring下token過期時(shí)間分平臺(tái)(web和app)設(shè)置方法
本文詳細(xì)介紹了在Spring環(huán)境下,針對(duì)web端和APP端實(shí)現(xiàn)不同token過期時(shí)間的方法,通過整合SpringBoot、springSecurity和JWT框架,文章講解了登錄流程、JWT的基本組成以及token鑒權(quán)的核心步驟,需要的朋友可以參考下2024-10-10
關(guān)于maven環(huán)境的安裝及maven集成idea環(huán)境的問題
Maven 是一個(gè)基于 Java 的工具,所以要做的第一件事情就是安裝 JDK。本文重點(diǎn)給大家介紹關(guān)于maven環(huán)境的安裝及和idea環(huán)境的集成問題,感興趣的朋友一起看看吧2021-09-09

