Java方法遞歸與輸入輸出深入探索
【前言】
在Java編程的廣闊領(lǐng)域中,方法遞歸和輸入輸出(I/O)是兩個(gè)極為重要的概念。方法遞歸為解決特定類型的問題提供了一種優(yōu)雅且高效的思路;而輸入輸出則是Java程序與外部世界交互的橋梁,無(wú)論是讀取文件數(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è)簡(jiǎn)單而強(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)在于代碼簡(jiǎn)潔、優(yōu)雅,符合人類對(duì)問題的分解思考方式,對(duì)于某些問題如樹形結(jié)構(gòu)遍歷,遞歸實(shí)現(xiàn)非常直觀。
- 由于遞歸調(diào)用會(huì)消耗棧空間,對(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 基本語(yǔ)法
System.out.println(msg);//輸出字符串,換行 System.out.print(msg);//不換行 System.out.printf(format, msg);//格式化輸出
- print 后面帶\n 就換行
- 與C語(yǔ)言基本一致
- 快捷鍵:輸入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;
頁(yè)面頂部就會(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 來(lái)結(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)文章
使用EasyPoi實(shí)現(xiàn)多Sheet頁(yè)導(dǎo)出的示例代碼
在項(xiàng)目開發(fā)中,我們常常會(huì)遇到導(dǎo)出多Sheet頁(yè)的需求,本文降維打擊介紹一下如何使用EasyPoi實(shí)現(xiàn)這一功能,文中的示例代碼簡(jiǎn)潔易懂,有需要的可以參考下2025-03-03
Mybatis基于xml配置實(shí)現(xiàn)單表的增刪改查功能
這篇文章主要介紹了Mybatis基于xml配置實(shí)現(xiàn)單表的增刪改查,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Java 線程的優(yōu)先級(jí)(setPriority)案例詳解
這篇文章主要介紹了Java 線程的優(yōu)先級(jí)(setPriority)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Java 多層嵌套JSON類型數(shù)據(jù)全面解析
這篇文章主要介紹了Java 多層嵌套JSON類型數(shù)據(jù)全面解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringBoot中的定時(shí)調(diào)度服務(wù)使用詳解
本文介紹了SpringBoot中定時(shí)任務(wù)的實(shí)踐應(yīng)用,包括pom包配置、啟動(dòng)類啟用定時(shí)調(diào)度、創(chuàng)建定時(shí)任務(wù)、異步執(zhí)行定時(shí)任務(wù)、自定義任務(wù)線程池等內(nèi)容,SpringBoot內(nèi)置的@Scheduled注解可以滿足大部分業(yè)務(wù)需求2026-04-04
SpringBoot整合華為GaussDB企業(yè)版的實(shí)現(xiàn)
本文詳細(xì)介紹了Spring Boot整合華為GaussDB企業(yè)版的完整實(shí)現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
Spring中TransactionSynchronizationManager的使用詳解
這篇文章主要介紹了Spring中TransactionSynchronizationManager的使用詳解,TransactionSynchronizationManager是事務(wù)同步管理器,監(jiān)聽事務(wù)的操作,來(lái)實(shí)現(xiàn)在事務(wù)前后可以添加一些指定操作,需要的朋友可以參考下2023-09-09

