Java方法的递归调用求100以内自然数的累加和以及斐波拉契数列

问题:

求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); } }
扫描二维码关注公众号,回复: 9550803 查看本文章

斐波拉契数列:

从第三项开始,每个数都等于前面两个数的和。

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

猜你喜欢

转载自www.cnblogs.com/majestyking/p/12401655.html