求1!+2!+3!+...+n!=?


編寫一個Java程序輸出1!+2!+3!+……+n!的和?

public class GetSumMethod
{
    /**
     * 利用遞歸寫的一個階乘運算,發現非常的占用資源。慎用。
     * 遞歸能不用,盡量不用,結構雖然簡單,但是數據量一大很容易棧溢出。
     * @param n
     * @return
     */

    public int getJieCheng(int n)
    {
        if(n == 1)
        {
            return n;
        }
        else
        {
            return getJieCheng(n-1)*n;
        }
    }

    /**
     * 利用迭代相乘的辦法得到階乘。
     * @param n
     * @return
     */
    public long getJieChengOne(int n)
    {
        long temp = 1L;
        for(int i= 1; i<= n; i++)
        {
            temp *= i;
        }
        return temp;
    }

    public long getSum(int n)
    {
        long sum = 0L;
        /**
         * 此處注意0階乘是零。
         */
        for(int i = 1; i <= n; i++)
        {
            sum+=getJieCheng(i);
        }
        return sum;
    }

    public long getSumOne(int n)
    {
        long sum = 0L;
        /**
         * 此處注意0階乘是零。
         */
        for(int i = 1; i <= n; i++)
        {
            sum+=getJieChengOne(i);
        }
        return sum;
    }

    @Test
    public void testGetJieCheng()
    {
        long time2= System.currentTimeMillis();
        long sum1 = getSumOne(10000);
        time2= System.currentTimeMillis() -time2;
        System.out.println("迭代用時:"+time2);
        long time1=System.currentTimeMillis();
        long sum = getSum(10000);
        time1=System.currentTimeMillis()-time1;
        System.out.println("遞歸用時:"+time1);
    }
}

 

偶然間碰到這個題,很簡單,但也容易出錯。比如大多數程序員都是從零開始計數,殊不知,0的階乘不是0而是1。反正當時我寫的時候沒想起來0的階乘是1想當然的認為0的階乘是0對結果不會有影響。后來發現是不是應該從1開始試試,結果一試瞬間就明白了,0的階乘是0不是1.

還有階乘雖然結構簡單,但是效率極低,而且特別容易棧溢出。

對程序進行的性能測試。當都計算10000的階乘累加和的時候。

迭代用時:78
遞歸用時:312

遞歸的耗時正好是迭代的4倍。

當計算30000的階乘累加時:

迭代用時:621
遞歸用時:3167

遞歸的耗時是迭代的5倍多。

所以由此可見,遞歸運算十分的占用內存資源,而且運行效率低下。所以能不用盡量不用。

 


免責聲明!

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



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