斐波那契數列累加求前n項和
阿新 • • 發佈:2019-01-03
斐波那契累加求前n項和
寫一個斐波那契求和的演算法,第一反應太簡單了,遞迴一下就求出來了
常規的方法:
對於上面的程式碼雖然能求出結果,但是當n>40的時候,時間消耗非常之大,原因很簡單,每一次都要重複的算。<span style="white-space:pre"> </span>/** * 求前n項的累加和 * @param n * @return */ public static int feb_sum(int n) { int sum = 0; for(int i=1;i<=n;i++) { sum += febnaqi(i); //累加前n項 } return sum; } /** * 求斐波那契數列的第n項值 * @param n * @return */ public static int febnaqi(int n){ if(n ==1 || n == 2) { return 1; }else return febnaqi(n-1) + febnaqi(n-2); //遞迴的呼叫自己 }
於是改進了一下
改進的後的演算法世間消耗要比第一種快上超千倍之多。<span style="white-space:pre"> </span>/** * 求斐波那契數列的前n項的和 * @param n * @return */ public static long feb_sum(int n) { long sum; if(n == 1) sum = 1; else if(n == 2) sum =2; else { long[] a = {1,1}; //臨時陣列a存放第n項的前兩個數 sum = 2; //第一項a1和第二項a2先加 for(int i=2;i<n;i++){ a[i%2] = a[0] + a[1]; sum += a[i%2]; } } return sum; }
所以,使用遞迴的時候尤其要注意遞迴的深度,不當使用遞迴的後果是災難性的。