问题:
求100以内自然数的累加和。1+2+3+4+5...+98+99+10
考察:方法的递归调用
难点:
递归调用可以看作的循环,既然时循环就要有结束循环的条件,不然就是个死循环。
方法一:
用for循环来实现累加求和。难点在于,要定义一个变量"sum"来接收每次相加的和。
@Testpublic voidadd() {int sum=0;for(int i=1;i<=100;i++){
sum+=i;
}
System.out.println("sum:="+sum);
}
方法二:
用方法的递归调用来实现。难点:首先考虑在什么情况下循环会结束,然递归时值不断向结束循环的情况改变。
public static int recall(intn) {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(intnum) {if(num < 1)return 0;if(num < 3)return 1;return fibRec(num - 1) + fibRec(num - 2);
}
三:
用递归调用实现斐波拉契数列.支持超过92的大数。
static List list = new ArrayList(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(intnum) {if(num < 0)return list.get(0);if (list.size() <=num)
list.add(fibBig(num- 1).add(fibBig(num - 2)));returnlist.get(num);
}
其它参考:
https://www.cnblogs.com/swfpt/p/6850396.html