題目:寫一個函數,輸入n,求斐波那契數列的第n項。斐波那契數列的定義以下:面試
一、效率很低效的解法,挑剔的面試官不會喜歡函數
使用遞歸實現:spa
public class Fibonacci { public long getNum(int n){ if(n<=0){ return 0; }else if(n==1){ return 1; }else{ return getNum(n-1)+getNum(n-2); } } }
咱們不難發如今這顆樹中有不少的節點是重複的,並且重複的節點數會隨着n的增大而急劇增長,這意味着計算量會隨着n的增大而急劇增大。事實上,用遞歸的方法計算的時間複雜度是以n的指數的方式遞增的。讀者不妨求Fibonacci的第100項試試,感覺一下這樣的遞歸會慢到什麼程度。code
二、面試官期待的適用解法:blog
其實改進的方法並不複雜,將計算出來的中間項保存起來,減小計算次數遞歸
public class Fibonacci2 { public long getNum(int n){ if(n==0){ return 0; } if(n==1){ return 1; } int temp1=0;//第n-2項的值 int temp2=1;//第n-1項的值 int result=0;//保存中間計算出來的結果 for(int i=2;i<=n;i++){ result=temp1+temp2; temp1=temp2; temp2=result; } return result; } }