騰訊一道面試題:50個台階,可以一次走一個台階,也可以一次走兩個台階,那么走到50個台階時,有多少種可能?
分析:
任何算法的背后,都隱藏着一個數學理論的支撐,所以大家都知道,數學是進階算法的基石。
這道題,我們先從最基本的分析,找規律,假設可能情況為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,是個很大的數,遞歸不是一個好方法,所以,用循環實現如下:
1 #include<stdint.h>
2 #include<stdio.h>
3 int main() 4 { 5 uint64_t a[50]; 6 a[0] = 1; 7 a[1] = 2; 8 for (int i = 2; i < 50; i++) 9 { 10 a[i] = a[i - 1] + a[i - 2]; 11 printf("%lld\n", a[i]); 12 } 13
14 return 0; 15 }
代碼很簡單。但這個數是真大哦。需要一個分析過程,用輸出的結果的大概應證了我們的歸納正確。要想證明,請數學大佬們自己來。
透過現象看本質:
這個面試題,究其本源,到底考察的是什么?前面說到,所有算法一定有個數學理論支撐,所以,這個面試題,考察的就是著名的斐波那契數列。斐波那契數列
萬變不離其數學本源,所以,要想提高程序員的層次,算法是個必備的技能,而在次期間,數學也是需要我們掌握的必備技能,你可以不創造算法,不去推到算法實現的過程,但你一定要能把算法用代碼實現,並找到其數學本源。
路漫漫兮其修遠,吾將上下而求索。