面試題9 遞迴和非遞迴

2021-07-13 11:51:52 字數 2047 閱讀 2789

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,求...