問題:
求100以內自然數的累加和。1+2+3+4+5...+98+99+10
考察:方法的遞歸調用
難點:
遞歸調用可以看作的循環,既然時循環就要有結束循環的條件,不然就是個死循環。
方法一:
用for循環來實現累加求和。難點在於,要定義一個變量"sum"來接收每次相加的和。
@Test public void add() { int sum=0; for(int i=1;i<=100;i++){ sum+=i; } System.out.println("sum:="+sum); }
方法二:
用方法的遞歸調用來實現。難點:首先考慮在什么情況下循環會結束,然遞歸時值不斷向結束循環的情況改變。
public static int recall(int n) { if(n==1){ return 1; }else{
//在方法體中調用方法自己就是遞歸調用。
//下面的n-1,經過多次遞歸調用后,n的值會變為1,而當n等於1時,函數就結束了,直接renturn了。 return n+recall(n-1); } }
斐波拉契數列:
從第三項開始,每個數都等於前面兩個數的和。
1,1,2,3,5,8,13,21,34,55,89,144...
一:
用for循環結算斐波拉契數列。只能計算小於等於92的情況,因為當大於92時,計算結果就超出了long整形的表示范圍。
public static long fibLoop(int num) {
if (num < 1 || num>92)
return 0;
long a = 1;
long b = 1;
long temp;
for (int i = 3; i <= num; i++) {
temp = a;
a = b;
b += temp;
}
return b;
}
二:
用遞歸調用實現斐波拉契數列。
public static long fibRec(int num) { if(num < 1) return 0; if(num < 3) return 1; return fibRec(num - 1) + fibRec(num - 2); }
三:
用遞歸調用實現斐波拉契數列.支持超過92的大數。
static List<BigDecimal> list = new ArrayList<BigDecimal>(93); static { list.add(BigDecimal.ZERO); list.add(BigDecimal.ONE); } /** * 1,2,3,4,5,6, 7 ,8 * 1,1,2,3,5,8,13,21 * 支持num超過92的超大型數字,使用了ArrayList進行緩存以提高性能 */ public static BigDecimal fibBig(int num) { if(num < 0) return list.get(0); if (list.size() <= num) list.add(fibBig(num - 1).add(fibBig(num - 2))); return list.get(num); }
其它參考:
https://www.cnblogs.com/swfpt/p/6850396.html
