面試題9 斐波那契數列

2021-09-08 03:30:03 字數 1889 閱讀 7925

題目1:寫乙個函式,輸入n,其斐波那契數列的第n項。
斐波那契數列的定義如下:

斐波那契數列的定義就是遞迴的,我們根據定義可以很簡單的寫出**。**如下:

#include#include

using

namespace

std;

//f(n)= n>=0

int fibonacci(int

n)void

main()

但是這樣的方法存在明顯的不足,該方法的時間複雜度是n的指數級別,隨著n的增大,運算時間不可想象,比如說f(50)就要很久。時間複雜度之所以這麼大,是因此計算過程中存在著重複計算。以f(10)為例,f(10)=f(9)+f(8),f(9)=f(8)+f(7)。其中的f(8)就是重複計算的。

前面我們計算斐波那契數列是從後往前計算的,就是計算f(n)=f(n-1)+f(n-2),然後再遞迴計算f(n-1),又是從後往前計算,就是因為這樣的從後往前計算,所以才會有很多的重複計算。那麼我們可以逆轉思路,考慮從前往後計算。比如我們要計算f(4),那麼我們就計算f(0)、f(1)、f(2)、f(3),將這些計算出來的值儲存在乙個陣列arry[n+1]上,這樣計算斐波那契數列就相當於是乙個填表的過程。時間複雜度大大降低。**例項如下:

int fibonacci(int

n)

int result=arry[n];

//因為動態建立的陣列不會因為出了作用域,記憶體就會被釋放。

//動態分配的陣列將一直存在,直到程式顯示釋放它為止,因此這裡使用delete

//c++提供delete 表示式釋放指標所指向的陣列空間。

delete arry;

return

result;}}

因為不知道要求的f(n)中的n有多大,因此不能事先開闢乙個陣列,需要動態建立陣列。而動態陣列與陣列變數不同,動態分配的陣列將一直存在,直到程式顯式釋放它為止。普通的陣列變數,只要出了陣列的作用於,其記憶體會自動釋放。

c++提供delete 表示式釋放指標所指向的陣列空間。delete arry;該語句**了arry所指向的陣列,把相應的記憶體返回給自由儲存區。在關鍵字delete和指標arry之間的方括號是必不可少的:它告訴編譯器該指標指向的是自由儲存區中的陣列,而非單個物件。delete arry只釋放了arry指標所指向的記憶體位址,理論上來說會少釋放了記憶體空間,從而產生記憶體洩露。

在方法2中,我們儲存了每乙個中間變數,但是仔細觀察我們可以發現沒有必要儲存每乙個中間變數,我們只需要儲存兩個臨時變數即可完成斐波那契數列的計算。具體**試下如下:

int fibonacci(int

n)

return

fn; }

}

這道題目的本質就是斐波那契數列。假設只有乙個台階,那麼只有一種跳法,那就是一次跳一級,f(1)=1;如果有兩個台階,那麼有兩種跳法,第一種跳法是一次跳一級,第二種跳法是一次跳兩級,f(2)=2。如果有大於2級的n級台階,那麼假如第一次跳一級台階,剩下還有n-1級台階,有f(n-1)種跳法,假如第一次條2級台階,剩下n-2級台階,有f(n-2)種跳法。這就表示f(n)=f(n-1)+f(n-2)。將上面的斐波那契數列**稍微改一下就是本題的答案。這列略之。

題目3:我們可以用2x1(2行1列)的小矩形橫著或者豎著去覆蓋更大的矩形。請問用8個2x1的小矩形無重複地覆蓋乙個2x8的大矩形,總共有多少種方法。
這道題目還是斐波那契數列的變種。設f(8)表示覆蓋2x8大矩形的方法綜述。假設第乙個小矩形是豎著去覆蓋大矩形,那麼還剩下由7個2x1的小矩形組成的大矩形f(7);假設第乙個小矩形是橫著去覆蓋大矩形,那麼還剩下由6個2x1的小矩形組成的大矩形f(6)。即f(8)=f(7)+f(6)。依此類推,最後f(1)=1,f(2)=2。使用計算斐波那契數列的方法計算這道題目即可求出答案。

面試題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...