創(chuàng)建java遞歸的方法:首先創(chuàng)建明確的遞歸結(jié)束條件;然后設(shè)置判斷條件,代碼為【private static int sumNum(int n){if (n == 1){return 1;}return n + sumNum(n-1)}】。
創(chuàng)建java遞歸的方法:
程序調(diào)用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用。 一個(gè)過(guò)程或函數(shù)在其定義或說(shuō)明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的規(guī)模較小的問(wèn)題來(lái)求解,遞歸策略只需少量的程序就可描述出解題過(guò)程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語(yǔ)句來(lái)定義對(duì)象的無(wú)限集合。一般來(lái)說(shuō),遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。
首先,我們來(lái)看一下最簡(jiǎn)單的求和例子。
<span style="font-size:18px;">public static void main(String[] args) { System.out.println(sumNum(100)); //輸出:5050 } //求1-100的和 private static int sumNum(int n) { if (n == 1) { return 1; } return n + sumNum(n-1); }</span>
下面我們用遞歸實(shí)現(xiàn)斐波那契數(shù)列。
斐波那契數(shù)列,又稱黃金分割數(shù)列,指的是這樣一個(gè)數(shù)列:0、1、1、2、3、5、8、13、21、……在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義:F(0)=0,F(xiàn)(1)=1,F(xiàn)(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在現(xiàn)代物理、準(zhǔn)晶體結(jié)構(gòu)、化學(xué)等領(lǐng)域,斐波納契數(shù)列都有直接的應(yīng)用。
//用遞歸求解 public static int fib(int n) { if (n == 0) return 0; if (n == 1 || n == 2) return 1; return fib(n - 1) + fib(n - 2); } //用循環(huán)求解 public static int fib2(int n) { int a = 0, b = 1, c = 1; if (n == 0) return 0; if (n == 1 || n == 2) return 1; for (int i = 0; i < n - 1; i++) { c = a + b; a = b; b = c; } return c; } //用數(shù)組求解 public static int fib3(int n) { int[] arr = new int[n + 1]; arr[0] = 0; arr[1] = 1; for (int i = 2; i <= n; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } return arr[n]; }
下面再來(lái)看一下另外一個(gè)例子,計(jì)算階乘。
階乘是基斯頓·卡曼(Christian Kramp,1760~1826)于 1808 年發(fā)明的運(yùn)算符號(hào),是 數(shù)學(xué)術(shù)語(yǔ)。
一個(gè)正整數(shù)的 階乘( 英語(yǔ): factorial)是所有小于及等于該數(shù)的 正整數(shù)的 積,并且有0的階乘為1。 自然數(shù)n的階乘寫(xiě)作n!。 亦即n!=1×2×3×…×n。階乘亦可以 遞歸 方式定義:0!=1,n!=(n-1)!×n。
//用遞歸計(jì)算階乘 public static int jc(int n) { //結(jié)束條件 if ( n == 1) return 1; //遞歸條件 return n * jc(n-1); } //用for循環(huán)實(shí)現(xiàn)階乘 public static int jc2(int n) { int sum = 1; for (int i = 1; i <= n; i++) { sum *= i; } return sum; }
遞歸的條件:
1、 結(jié)束條件: 必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。
2、 遞歸條件: 遞歸的運(yùn)算法則.
遞歸的特點(diǎn):
1、簡(jiǎn)潔明了: 遞歸算法,一般讓人一眼就能看出運(yùn)算結(jié)構(gòu),很接近于數(shù)學(xué)自然語(yǔ)言。
2、內(nèi)存消耗大:在遞歸調(diào)用的過(guò)程當(dāng)中系統(tǒng)為每一層的返回點(diǎn)、局部量等開(kāi)辟了棧來(lái)存儲(chǔ)。遞歸次數(shù)過(guò)多容易造成棧溢出等。所以一般不提倡用遞歸算法設(shè)計(jì)程序。
相關(guān)學(xué)習(xí)推薦:java基礎(chǔ)教程