分析:任何演算法的背後,都隱藏著乙個數學理論的支撐,所以大家都知道,數學是高階演算法的基石。
這道題,我們先從最基本的分析,找規律,假設可能情況為an,不難發現,a1=1,a2=2,a3=3,a4=5,a5=8.....求解a50;顯然不可能人工計算最後的結果,那麼我們從c/c++程式設計師的思路來分析:
這道題應該用什麼方式來實現呢?必須要知道這些數的關係,逆向思維,遞迴思路是否能派上用場?要求a50,我們先求a49,要求a49,先求a48,以此類推到a1。貌似遞迴是個不錯的選擇,但是在這之前,還必須解決乙個問題,就算是遞迴,也得知道這些資料的關聯,怎麼去遞迴呼叫,還是不能避開這個數學問題,我們需要找到乙個通項公式,無論遞迴還是迴圈,必須建立在這個基礎上。
這裡,我們最容易想到的就是找規律,用數學歸納法,證明可以先不用,通常是先用觀察所得設計演算法,完成演算法設計之後,用多個實驗資料證明歸納正確之後,再有必要,才去用數學方法證明。
這裡的規律還是顯而易見的,不難發現,an=a(n-1)+a(n-2);通過上面的資料這個是容易得到的,當前數等於前兩個數的和。這樣的話,遞迴或者迴圈都可以解決了。但是,遞迴在大資料面前,是不建議使用的,這裡千萬別小看了a50,是個很大的數,遞迴不是乙個好方法,所以,用迴圈實現如下:
**很簡單。但這個數是真大哦。需要乙個分析過程,用輸出的結果的大概應證了我們的歸納正確。要想證明,請數學大佬們自己來。
透過現象看本質:
這個面試題,究其本源,到底考察的是什麼?前面說到,所有演算法一定有個數學理論支撐,所以,這個面試題,考察的就是著名的斐波那契數列。斐波那契數列
萬變不離其數學本源,所以,要想提高程式設計師的層次,演算法是個必備的技能,而在次期間,數學也是需要我們掌握的必備技能,你可以不創造演算法,不去推到演算法實現的過程,但你一定要能把演算法用**實現,並找到其數學本源。
路漫漫兮其修遠,吾將上下而求索。
面試題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...