问题:
求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