如果我們需要多次計算相同的問題,通常可以選擇使用遞迴或者迴圈兩種不同的方法。遞迴是在乙個函式的內部呼叫這個函式自身。而迴圈則是通過設定計算的初始值及終止條件,在乙個範圍內重複運算。
題目1:寫乙個函式,輸入n,求斐波那契數列的第n項。
斐波那契數列的定義如下:
f(n)=0,n=0;
f(n)=1,n=1;
f(n)=f(n-1)+f(n-2),n>1
效率很低的解法:
long
long fibonacci(unsigned
int n)
上述的遞迴解法有很嚴重的效率問題。用遞迴的方法計算的時間複雜度是以n的指數的方式遞增的。
上述的遞迴**之所以慢是因為重複的計算太多,所以需要想辦法避免重複計算就可以了。eg:可以把已經得到的數列中間項儲存起來,如果下次需要計算的時候先查詢一下,如果前面已經計算過就不用再重複計算了。
實用解法:
long
long fibonacci(unsigned n)
; if(n<2)
return result[n];
long
long fibnminusone=1;
long
long fibnminustwo=0;
long
long fibn=0;
for(unsigned
int i=2;i<=n;++i)
return fibn;
}
面試題9 斐波那契數列
方法一 很容易想到的解法是直接使用遞迴。c include stdafx.h include using namespace std long long fibonacci unsigned int n if n 1 return fibonacci n 1 fibonacci n 2 int tm...
面試題9 斐波那契數列
題目一 寫乙個函式,輸入n,求斐波那契數列的第n項,斐波那契數列的定義如下 0 n 0 f n 1 n 1 f n 1 f n 2 n 1 遞迴 long long fibonacci unsigned int n if n 0 n 1 return n return fibonacci n 1 f...
面試題9 斐波那契數列
面試題9 題目 寫乙個函式,輸入n,求斐波那契數列的第n項。很多教科書中的解法 long long fibonacci solution1 unsigned int n 這是從第n項向前計算的方法,很多計算量實際上是重複的。long long fibonacci solution2 unsigned...