程序調(diào)用自身的編程技巧稱為遞歸(recursion),它做為一種算法在程序設(shè)計語言中廣泛應(yīng)用。Java支持遞歸,在 Java 編程中,遞歸是允許方法調(diào)用自身調(diào)用的屬性。調(diào)用自身的方法稱為是遞歸的。
一個物理世界的實例是放置兩個彼此面對的平行反射鏡。它們之間的任何對象都將被遞歸地反射。
遞歸如何工作?
Java遞歸的工作流程圖
在上面的示例中,我們從main方法內(nèi)部調(diào)用了recurse()方法。 ?
在recurse()方法內(nèi)部,我們再次調(diào)用相同的recurse方法。 這是一個遞歸調(diào)用。
為了停止遞歸調(diào)用,我們需要在方法內(nèi)部提供一些條件。否則,該方法將被無限調(diào)用。
因此,我們使用if...else..或類似方法)終止方法內(nèi)部的遞歸調(diào)用。
示例:使用遞歸的階乘
class Factorial {
static int factorial( int n ) {
if (n != 0) // 終止條件
return n * factorial(n-1); //遞歸調(diào)用
else
return 1;
}
public static void main(String[] args) {
int number = 4, result;
result = factorial(number);
System.out.println(number + " 的階乘= " + result);
}
}
輸出:
4?的階乘=?24
在上面的示例中,我們有一個名為factorial()的方法。 從main()方法調(diào)用factorial()。 用傳遞的數(shù)字變量作為參數(shù)。
在這里,請注意以下語句:
return n * factorial(n-1);
factorial()方法正在調(diào)用自身。 最初,n的值在factorial()內(nèi)部為4。 在下一個遞歸調(diào)用期間,將3傳遞給factorial()方法。 此過程一直持續(xù)到n等于0。
當(dāng)n等于0時,if語句返回false,因此返回1。最后,將累積的結(jié)果傳遞給main()方法。
階乘程序的工作流程
下圖將使您更好地了解如何使用遞歸執(zhí)行階乘程序。
使用遞歸的階乘程序
遞歸的優(yōu)缺點
進行遞歸調(diào)用時,將在堆棧上分配新的變量存儲位置。隨著每個遞歸調(diào)用的返回,舊的變量和參數(shù)將從堆棧中刪除。因此,遞歸通常使用更多的內(nèi)存,并且通常很慢。
另一方面,遞歸解決方案要簡單得多,并且花費更少的時間來編寫,調(diào)試和維護。
java中方法如何遞歸調(diào)用
方法遞歸是指在方法中調(diào)用自身的過程。
在Java中,可以通過以下步驟實現(xiàn)方法遞歸調(diào)用:
- 定義一個方法,并確保該方法可以接受參數(shù)。
- 在方法內(nèi)部使用條件語句(if/else)或循環(huán)語句(while/for)來控制方法是否繼續(xù)遞歸調(diào)用自身。
- 在條件語句或循環(huán)語句內(nèi)部,調(diào)用該方法并傳入新的參數(shù)。這樣,方法就會重新執(zhí)行,并且可能再次遞歸調(diào)用自身。
- 當(dāng)條件不再滿足時,遞歸過程就會停止,并將結(jié)果返回給調(diào)用者。
以下是一個簡單的例子,展示了如何使用遞歸來計算階乘:
public class RecursionExample {
public static int factorial(int n) {
if (n == 1) //遞歸終止條件
return 1;
else
return n * factorial(n-1); //遞歸調(diào)用
}
public static void main(String[] args) {
int num = 5;
int result = factorial(num);
System.out.println("Factorial of " + num + " is " + result);
}
}
在上面的示例中,factorial方法使用遞歸計算給定數(shù)字的階乘。當(dāng)n等于1時,遞歸終止。否則,它會調(diào)用自身并將n-1作為參數(shù)傳遞。在每個遞歸調(diào)用中,n的值都會減少,直到遞歸終止。最終,將計算出階乘的值,并將其返回給調(diào)用者。
案例:使用遞歸調(diào)用打印十進制整數(shù)對應(yīng)的二進制碼
以下是JAVA代碼實現(xiàn):
public class DecimalToBinary {
public static void main(String[] args) {
int decimal = 15;
System.out.print("二進制數(shù)為:");
decimalToBinary(decimal);
}
public static void decimalToBinary(int decimal) {
if (decimal > 0) {
decimalToBinary(decimal / 2);
System.out.print(decimal % 2);
}
}
}
輸出結(jié)果為:
二進制數(shù)為:1111文章來源:http://www.zghlxwxcb.cn/news/detail-612183.html
說明:文章來源地址http://www.zghlxwxcb.cn/news/detail-612183.html
- 該代碼分為兩部分:主函數(shù)和遞歸函數(shù)。
- 主函數(shù)中定義了一個十進制整數(shù)變量 decimal,并調(diào)用了遞歸函數(shù) decimalToBinary(),并將 decimal 作為參數(shù)傳遞給該函數(shù)。
- 遞歸函數(shù) decimalToBinary() 實現(xiàn)了將十進制整數(shù)轉(zhuǎn)換成二進制數(shù)的功能。
- 遞歸函數(shù)中如果傳入的十進制整數(shù)大于 0,則遞歸調(diào)用自身并將傳入?yún)?shù)除以 2,以實現(xiàn)對二進制數(shù)的分解。
- 最后在每次遞歸調(diào)用結(jié)束時,輸出 傳入?yún)?shù)對 2 取余數(shù)的結(jié)果,以實現(xiàn)對二進制數(shù)的生成。
到了這里,關(guān)于Java遞歸算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!