劍指offer 面試題9

2022-08-18 10:12:12 字數 1491 閱讀 1093

題目一:求斐波那契數列第n項

自己所寫**如下:

#include "

stdafx.h

"#include

long fibonacci(unsigned int

n)

return (n % 2 == 0)?f0 : f1;

}}int

main()

return0;

}

雖然知道可以用遞迴實現,但實際寫**卻有些生疏,關鍵是對遞迴不是很熟練。。。

long fibonacci(unsigned intn);

//遞迴終止條件

if(n < 2

)

return

results[n];

return fibonacci(n-1) + fibonacci(n-2

);}

遞迴**相當簡潔!但正如書中所說,用遞迴求解斐波那契數列的第n項,會由於有很多重複的子問題求解,比如求解f(10)時,會求解兩次f(8),因而造成計算複雜度隨著n的增大而急劇增加!因此,該題用遞迴解並不是一種好的選擇!時間複雜度:o(2_^n),即以n為指數的增長。

作者所寫基於迴圈的實現如下:(很規範)

long fibonacci(unsigned intn);

if(n < 2

)

return

results[n];

long fib_0 = results[0

];

long fib_1 = results[1

];

long

fib_i;

for(int i=2; i <= n; i++)

return

fib_i;

}

和自己所寫的**,思想一致!時間複雜度:o(n)。
該題時間複雜度可以達到o(logn),只做了解了。

題目二:(關於斐波那契數列的應用)

青蛙跳台階,每次只能跳1個台階或者2個台階,則問青蛙若要跳n個台階共有多少種跳法?

分析:該題的思路不太好想。。。

首先要想到以n為變數,n個台階的跳法共有f(n)種,那麼:

分析一:到第n-1階後,再跳一步即到第n階,此時的跳法為f(n-1);

到第n-2階後,再跳乙個兩步或者連續跳一步即可到第n階,但此時注意到後者包含在上一步中,所以此時的跳法為f(n-2),而非2*f(n-2)。

分析二:以開始跳為分界點更好些。

第一跳若為跳一步,則剩下的n-1台階的跳法為f(n-1);

第一跳若為跳乙個兩步,則剩下的n-2台階的跳法為f(n-2);

避免 對分析一中特殊情況的忽略。

綜上,n個台階的跳法f(n)=f(n-1)+f(n-2)為斐波那契數列!!!

劍指offer 面試題9

對於第二道題目,我們可以認為有乙個函式f 放台階數是n時,有f n 種跳法,當台階數n 1時有f n 1 種跳法,以此類推 那麼f n 等於多少呢?青蛙第一次跳有兩種可能,要麼跳乙個台階,要麼跳兩個台階。跳乙個台階後還剩下n 1個台階,n 1個台階跳法有f n 1 種。跳兩個台階後還剩下n 2個台階...

劍指offer 面試題9

面試題 9 斐波那契數列 題目一 寫入乙個函式,輸入 n,求斐波那契切數列的第 n項。題目二 乙隻青蛙一次可以跳上一級台階,也可以跳上兩級台階,求該青蛙一次跳上乙個 n級的台階總共有多少種跳法。首先我們來看第二題,我們可以假設有乙個台階,青蛙跳法 1種 有兩個台階,青蛙跳法 2種 有三個台階,青蛙跳...

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...