求1!+2!+3!+...+n!=?
阿新 • • 發佈:2017-06-16
而且 可見 階乘 得到 ech 後來 開始 java 運行
編寫一個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倍多。
所以由此可見,遞歸運算十分的占用內存資源,而且運行效率低下。所以能不用盡量不用。
求1!+2!+3!+...+n!=?