1.題目:編寫函式,計算斐波拉契數列的第n項。定義如圖
分析:這是乙個經典的問題,很多人都會用遞迴的方法去解決,但是實際的效果真的可以用嗎,如果採用遞迴的方法,在求斐波拉契數列第n項的過程中,不僅會存在重複計算的項,而且而且函式呼叫自身也是有時間和空間消耗的,涉及到往棧中壓入資料和彈出資料,這將消耗大量的時間。而採用迴圈計算的方法則不會存在這種問題,時間複雜度為o(n)。關於計算斐波拉契數列第n項還有一種方法就是用矩陣相乘的方法。
用數學歸納法很容易證明,這樣可以將時間複雜度縮短至o(lgn).
原始碼:
/*遞迴和非遞迴的比較*/
#include#include #include using namespace std;
// ********************方法1:遞迴********************
long long fibonacci_solution1(unsigned int n)
// ********************方法2:迴圈********************
long long fibonacci_solution2(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;
}// ********************方法3:基於矩陣乘法********************
struct matrix2by2
long long m_00;
long long m_01;
long long m_10;
long long m_11;
};matrix2by2 matrixmultiply
(const matrix2by2& matrix1,
const matrix2by2& matrix2
)matrix2by2 matrixpower(unsigned int n)
else if (n % 2 == 0)
else if (n % 2 == 1)
return matrix;
}long long fibonacci_solution3(unsigned int n)
; if (n < 2)
return result[n];
matrix2by2 powernminus2 = matrixpower(n - 1);
return powernminus2.m_00;
}int main()
{ long long result;
clock_t start, finish;
double duration;
start = clock();
result = fibonacci_solution1(40);//遞迴方法計算
finish = clock();
duration = (double)(finish - start) / clocks_per_sec;
cout << "遞迴的結果是: "<
1.青蛙跳台階的問題,青蛙一次可以跳上一級台階,也可以跳兩級台階,問青蛙跳上n級的台階的總共的跳法。
2.用2x1的小矩形覆蓋更大的矩形的問題,n個2x1的小矩形覆蓋乙個2xn的大矩形的方法總數。
這些都是類似斐波拉契數列的問題。
面試題 單鏈表反轉 遞迴和非遞迴
include include typedef struct node node,linklist 一般反轉 linklist reverse linklist head node pre,cur,next pre head cur head next while cur head next nul...
java遞迴面試題
題目1 斐波那契數列 一列數的規則如下 1 1 2 3 5 8 13 21 34.求第30位數是多少,用遞迴演算法實現。public static int getfabonaccisequencebynum int num logic return getfabonaccisequencebynum...
筆試面試題之遞迴
1.字串的全排列。全排列就是從第乙個數起每個數分別與它後面的數交換。遞迴實現 從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以對字串abc進行全排列為例,我們可以這麼做 以abc為例 固定a,求後面bc的排列 abc,acb,求...