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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM