JAVA基礎——遞迴
阿新 • • 發佈:2018-12-10
“遞迴”過程是指函式呼叫其本身的過程。但是函式每次在自身呼叫的同時會佔用更多的記憶體空間,儲存它區域性變數的附加副本。如果這個程序無限持續,最終會棧溢位,導致StackOverflowError錯誤。
遞迴優點:簡化程式設計,程式碼簡單,可讀性好。
缺點:邏輯複雜,空間消耗大,或者導致棧溢位。
package demo; public class Demo1026_2 { public static int age(int n){ int age = 18; for(int i = 2;i <= n;i ++){ age = age + 2; } return age; } //遞迴 public static int age2(int n){ if(n == 1){ return 18; }else{ return age2(n - 1) + 2; } } /** *求n的階乘 */ public static int fun(int a){ int fac = 1; for(int i = a;i > 0;i --){ fac = fac * i; } return fac; } //遞迴 public static int fun2(int a){ int tmp = 1; if(a == 1) { return tmp; }else { tmp = fun2(a - 1) * a; return tmp; } } /** *漢諾塔問題 */ public static void move(char pos1,char pos2){ System.out.print(pos1 + "==>" + pos2 + " "); } public static void hanio(int n,char pos1,char pos2,char pos3){ if(n == 1){ move(pos1,pos3); }else{ hanio(n - 1,pos1,pos3,pos2);//將n-1個盤子從A經過C挪到B move(pos1,pos3);//最後一個從A到C hanio(n - 1,pos2,pos1,pos3);//n-1從B經A到C } } public static void main(String[] args) { System.out.println(age(5)); System.out.println(age2(5)); System.out.println(fun(5)); System.out.println(fun2(5)); hanio(1,'A','B','C'); System.out.println(); hanio(2,'A','B','C'); System.out.println(); hanio(3,'A','B','C'); } }
練習
斐波那契數列遞迴法
//斐波那契數列 //遞迴每次都要呼叫本身函式,迴圈是直接計算 /** * 分段函式 * F(n)={ *0<n<=2 f(n)=1 * n>2 f(n) = f(n-1) + f(n-2) */ package practise.recurrence; public class Fibonacc { //遞迴: // 數列的每一項 public static int fibonacc(int n){ if(n == 1 || n == 2){//第一項和第二項,返回1 return 1; }else{ return fibonacc(n - 1) + fibonacc(n - 2);//第n項等於(n-1)+(n-2) } } //for迴圈: public static int fibonacc2(int n){ int f1 = 1; int f2 = 1; int f3 = 1; for(int i = 3;i <= n;i ++){ f3 = f1 + f2; f1 = f2; f2 = f3; } return f3; } public static void main(String[] args) { int n = 10; for(int i = 1;i <= n;i ++){ System.out.print(fibonacc2(i) + " "); // System.out.print(fibonacc(i) + " ");//列印第一項到第n項 } } }