zoukankan      html  css  js  c++  java
  • 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); } }

    斐波拉契数列:

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

    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

  • 相关阅读:
    3、总结
    三分及小例题
    约瑟夫问题的推导
    对于联通块的处理
    扩展欧几里得与二元不定方程
    js 阻止事件捕获
    原生xhr发送JSON
    $timeout
    Angularjs Ng_repeat中实现复选框选中并显示不同的样式
    为什么用Object.prototype.toString.call(obj)检测对象类型?
  • 原文地址:https://www.cnblogs.com/majestyking/p/12401655.html
Copyright © 2011-2022 走看看